From f11e92fedb8bf813988a0293add7f62c7507239b Mon Sep 17 00:00:00 2001 From: joshmeranda Date: Mon, 21 Oct 2024 10:42:15 -0400 Subject: [PATCH 1/2] VERSION=103.1.2+up45.31.1 CHART=rancher-monitoring-crd make remove --- ...ncher-monitoring-crd-103.1.2+up45.31.1.tgz | Bin 205311 -> 0 bytes .../103.1.2+up45.31.1/Chart.yaml | 10 -- .../103.1.2+up45.31.1/README.md | 24 --- .../103.1.2+up45.31.1/files/crd-manifest.tgz | Bin 201608 -> 0 bytes .../103.1.2+up45.31.1/templates/_helpers.tpl | 50 ------ .../103.1.2+up45.31.1/templates/jobs.yaml | 152 ------------------ .../103.1.2+up45.31.1/templates/manifest.yaml | 8 - .../103.1.2+up45.31.1/templates/rbac.yaml | 76 --------- .../templates/validate-psp-install.yaml | 7 - .../103.1.2+up45.31.1/values.yaml | 17 -- index.yaml | 14 -- 11 files changed, 358 deletions(-) delete mode 100644 assets/rancher-monitoring-crd/rancher-monitoring-crd-103.1.2+up45.31.1.tgz delete mode 100644 charts/rancher-monitoring-crd/103.1.2+up45.31.1/Chart.yaml delete mode 100644 charts/rancher-monitoring-crd/103.1.2+up45.31.1/README.md delete mode 100644 charts/rancher-monitoring-crd/103.1.2+up45.31.1/files/crd-manifest.tgz delete mode 100644 charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/jobs.yaml delete mode 100644 charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/manifest.yaml delete mode 100644 charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/rbac.yaml delete mode 100644 charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring-crd/103.1.2+up45.31.1/values.yaml diff --git a/assets/rancher-monitoring-crd/rancher-monitoring-crd-103.1.2+up45.31.1.tgz b/assets/rancher-monitoring-crd/rancher-monitoring-crd-103.1.2+up45.31.1.tgz deleted file mode 100644 index 814a21b12b26588a2c0e6feb35a437e431c41954..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205311 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

nES&%hI@ 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૭<|Gv?7!7Qu&@ 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 z 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

jHx37Iy>!l*23yJ*M^49ZDKxZsQGF-qHIuD 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%0D30E|;`pI2QR&LJ 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 diff --git a/charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/_helpers.tpl b/charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/_helpers.tpl deleted file mode 100644 index edac2b315e..0000000000 --- a/charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/_helpers.tpl +++ /dev/null @@ -1,50 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# CRD Installation - -{{- define "crd.established" -}} -{{- if not (regexMatch "^([a-zA-Z]+[.][a-zA-Z]*)+$" .) -}} -{{ required (printf "%s is not a valid CRD" .) "" }} -{{- else -}} -echo "beginning wait for {{ . }} to be established..."; -num_tries=1; -until kubectl get crd {{ . }} -o=jsonpath='{range .status.conditions[*]}{.type}={.status} {end}' | grep -qE 'Established=True'; do - if (( num_tries == 30 )); then - echo "timed out waiting for {{ . }}"; - exit 1; - fi; - num_tries=$(( num_tries + 1 )); - echo "{{ . }} is not established. Sleeping for 2 seconds and trying again..."; - sleep 2; -done; -echo "successfully established {{ . }}"; -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/jobs.yaml b/charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/jobs.yaml deleted file mode 100644 index 51b512adf4..0000000000 --- a/charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/jobs.yaml +++ /dev/null @@ -1,152 +0,0 @@ -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ .Chart.Name }}-create - namespace: {{ .Release.Namespace }} - labels: - app: {{ .Chart.Name }} - annotations: - "helm.sh/hook": post-install, post-upgrade, post-rollback - "helm.sh/hook-delete-policy": before-hook-creation, hook-succeeded, hook-failed -spec: - template: - metadata: - name: {{ .Chart.Name }}-create - labels: - app: {{ .Chart.Name }} - spec: - serviceAccountName: {{ .Chart.Name }}-manager - securityContext: - runAsNonRoot: false - runAsUser: 0 - initContainers: - - name: set-preserve-unknown-fields-false - image: {{ template "system_default_registry" . }}{{ .Values.image.repository }}:{{ .Values.image.tag }} - imagePullPolicy: IfNotPresent - command: - - /bin/sh - - -c - - > - {{- range $path, $_ := (.Files.Glob "crd-manifest/**.yaml") }} - {{- $crd := get (get ($.Files.Get $path | fromYaml) "metadata") "name" }} - if [[ -n "$(kubectl get crd {{ $crd }} -o jsonpath='{.spec.preserveUnknownFields}')" ]]; then - patch='{"spec": {"preserveUnknownFields": false}}'; - if [[ -z "$(kubectl get crd {{ $crd }} -o jsonpath='{.spec.versions[0].schema}')" ]]; then - patch='{"spec": {"preserveUnknownFields": false, "versions": [{"name": "v1", "served": false, "storage": true, "schema": {"openAPIV3Schema": {"description": "placeholder", "type": "object"}}}]}}'; - fi - echo "Applying patch to {{ $crd }}: ${patch}" - if kubectl patch crd {{ $crd }} -p "${patch}" --type="merge"; then - {{- include "crd.established" $crd | nindent 18 }} - fi; - fi; - {{- end }} - containers: - - name: create-crds - image: {{ template "system_default_registry" . }}{{ .Values.image.repository }}:{{ .Values.image.tag }} - imagePullPolicy: IfNotPresent - command: - - /bin/sh - - -c - - > - echo "Applying CRDs..."; - mkdir -p /etc/crd; - base64 -d /etc/config/crd-manifest.tgz.b64 | tar -xzv -C /etc/crd; - kubectl replace -Rf /etc/crd || kubectl create -Rf /etc/crd; - - echo "Waiting for CRDs to be recognized before finishing installation..."; - - {{- range $path, $_ := (.Files.Glob "crd-manifest/**.yaml") }} - {{- $apiGroup := get (get ($.Files.Get $path | fromYaml) "spec") "group" }} - rm -rf $HOME/.kube/cache/discovery/*/{{ $apiGroup }}; - {{- end }} - - {{- range $path, $_ := (.Files.Glob "crd-manifest/**.yaml") }} - {{- $crd := get (get ($.Files.Get $path | fromYaml) "metadata") "name" }} - {{- include "crd.established" $crd | nindent 12 }} - {{- end }} - volumeMounts: - - name: crd-manifest - readOnly: true - mountPath: /etc/config - restartPolicy: OnFailure - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} - {{- if .Values.nodeSelector }} - {{- toYaml .Values.nodeSelector | nindent 8 }} - {{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} - {{- if .Values.tolerations }} - {{- toYaml .Values.tolerations | nindent 8 }} - {{- end }} - volumes: - - name: crd-manifest - configMap: - name: {{ .Chart.Name }}-manifest ---- -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ .Chart.Name }}-delete - namespace: {{ .Release.Namespace }} - labels: - app: {{ .Chart.Name }} - annotations: - "helm.sh/hook": pre-delete - "helm.sh/hook-delete-policy": before-hook-creation, hook-succeeded, hook-failed -spec: - template: - metadata: - name: {{ .Chart.Name }}-delete - labels: - app: {{ .Chart.Name }} - spec: - serviceAccountName: {{ .Chart.Name }}-manager - securityContext: - runAsNonRoot: false - runAsUser: 0 - initContainers: - - name: remove-finalizers - image: {{ template "system_default_registry" . }}{{ .Values.image.repository }}:{{ .Values.image.tag }} - imagePullPolicy: IfNotPresent - command: - - /bin/sh - - -c - - > - {{- range $path, $_ := (.Files.Glob "crd-manifest/**.yaml") }} - {{- $crd := get (get ($.Files.Get $path | fromYaml) "metadata") "name" }} - if kubectl patch crd {{ $crd }} -p '{"metadata": {"finalizers": []}}'; then - {{- include "crd.established" $crd | nindent 14 }} - fi; - {{- end }} - volumeMounts: - - name: crd-manifest - readOnly: true - mountPath: /etc/config - containers: - - name: delete-crds - image: {{ template "system_default_registry" . }}{{ .Values.image.repository }}:{{ .Values.image.tag }} - imagePullPolicy: IfNotPresent - command: - - /bin/sh - - -c - - > - echo "Deleting CRDs..."; - mkdir -p /etc/crd; - base64 -d /etc/config/crd-manifest.tgz.b64 | tar -xzv -C /etc/crd; - kubectl delete --ignore-not-found=true -Rf /etc/crd; - volumeMounts: - - name: crd-manifest - readOnly: true - mountPath: /etc/config - restartPolicy: OnFailure - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} - {{- if .Values.nodeSelector }} - {{- toYaml .Values.nodeSelector | nindent 8 }} - {{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} - {{- if .Values.tolerations }} - {{- toYaml .Values.tolerations | nindent 8 }} - {{- end }} - volumes: - - name: crd-manifest - configMap: - name: {{ .Chart.Name }}-manifest diff --git a/charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/manifest.yaml b/charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/manifest.yaml deleted file mode 100644 index 8dc9dfb447..0000000000 --- a/charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/manifest.yaml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ .Chart.Name }}-manifest - namespace: {{ .Release.Namespace }} -data: - crd-manifest.tgz.b64: - {{- .Files.Get "files/crd-manifest.tgz" | b64enc | indent 4 }} diff --git a/charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/rbac.yaml b/charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/rbac.yaml deleted file mode 100644 index a4d498b0fa..0000000000 --- a/charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/rbac.yaml +++ /dev/null @@ -1,76 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ .Chart.Name }}-manager - labels: - app: {{ .Chart.Name }}-manager -rules: -- apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: ['create', 'get', 'patch', 'delete', 'update', 'list'] -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ .Chart.Name }}-manager -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ .Chart.Name }}-manager - labels: - app: {{ .Chart.Name }}-manager -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ .Chart.Name }}-manager -subjects: -- kind: ServiceAccount - name: {{ .Chart.Name }}-manager - namespace: {{ .Release.Namespace }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ .Chart.Name }}-manager - namespace: {{ .Release.Namespace }} - labels: - app: {{ .Chart.Name }}-manager ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ .Chart.Name }}-manager - namespace: {{ .Release.Namespace }} - labels: - app: {{ .Chart.Name }}-manager -spec: - privileged: false - allowPrivilegeEscalation: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'configMap' - - 'secret' -{{- end }} diff --git a/charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/validate-psp-install.yaml b/charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring-crd/103.1.2+up45.31.1/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring-crd/103.1.2+up45.31.1/values.yaml b/charts/rancher-monitoring-crd/103.1.2+up45.31.1/values.yaml deleted file mode 100644 index 0f30e302f2..0000000000 --- a/charts/rancher-monitoring-crd/103.1.2+up45.31.1/values.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# Default values for rancher-monitoring-crd. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - -image: - repository: rancher/shell - tag: v0.1.25 - -nodeSelector: {} - -tolerations: [] diff --git a/index.yaml b/index.yaml index 755e15575c..6736e12fd2 100755 --- a/index.yaml +++ b/index.yaml @@ -21094,20 +21094,6 @@ entries: urls: - assets/rancher-monitoring-crd/rancher-monitoring-crd-103.2.0+up57.0.3.tgz version: 103.2.0+up57.0.3 - - annotations: - catalog.cattle.io/certified: rancher - catalog.cattle.io/hidden: "true" - catalog.cattle.io/namespace: cattle-monitoring-system - catalog.cattle.io/release-name: rancher-monitoring-crd - apiVersion: v1 - created: "2024-09-25T14:08:11.872589014-04:00" - description: Installs the CRDs for rancher-monitoring. - digest: a89a1a9bfe8ad8c2dee7ac42635364696dbfeb6799679ce73915cb8641335c55 - name: rancher-monitoring-crd - type: application - urls: - - assets/rancher-monitoring-crd/rancher-monitoring-crd-103.1.2+up45.31.1.tgz - version: 103.1.2+up45.31.1 - annotations: catalog.cattle.io/certified: rancher catalog.cattle.io/hidden: "true" From 6f937880dae512b35b26b7ace52dee50d0664577 Mon Sep 17 00:00:00 2001 From: joshmeranda Date: Mon, 21 Oct 2024 10:43:07 -0400 Subject: [PATCH 2/2] VERSION=103.1.2+up45.31.1 CHART=rancher-monitoring make remove --- .../rancher-monitoring-103.1.2+up45.31.1.tgz | Bin 440952 -> 0 bytes .../103.1.2+up45.31.1/.helmignore | 28 - .../103.1.2+up45.31.1/CHANGELOG.md | 47 - .../103.1.2+up45.31.1/CONTRIBUTING.md | 12 - .../103.1.2+up45.31.1/Chart.yaml | 124 - .../103.1.2+up45.31.1/README.md | 838 --- .../103.1.2+up45.31.1/app-README.md | 46 - .../charts/grafana/.helmignore | 23 - .../charts/grafana/Chart.yaml | 39 - .../charts/grafana/README.md | 688 --- .../grafana/dashboards/custom-dashboard.json | 1 - .../charts/grafana/templates/NOTES.txt | 55 - .../charts/grafana/templates/_helpers.tpl | 232 - .../charts/grafana/templates/_pod.tpl | 1162 ---- .../charts/grafana/templates/clusterrole.yaml | 25 - .../grafana/templates/clusterrolebinding.yaml | 24 - .../configmap-dashboard-provider.yaml | 29 - .../charts/grafana/templates/configmap.yaml | 138 - .../templates/dashboards-json-configmap.yaml | 35 - .../charts/grafana/templates/deployment.yaml | 51 - .../grafana/templates/extra-manifests.yaml | 4 - .../grafana/templates/headless-service.yaml | 22 - .../charts/grafana/templates/hpa.yaml | 52 - .../templates/image-renderer-deployment.yaml | 130 - .../grafana/templates/image-renderer-hpa.yaml | 47 - .../image-renderer-network-policy.yaml | 79 - .../templates/image-renderer-service.yaml | 31 - .../image-renderer-servicemonitor.yaml | 48 - .../charts/grafana/templates/ingress.yaml | 78 - .../grafana/templates/networkpolicy.yaml | 52 - .../grafana/templates/nginx-config.yaml | 94 - .../templates/poddisruptionbudget.yaml | 22 - .../grafana/templates/podsecuritypolicy.yaml | 45 - .../charts/grafana/templates/pvc.yaml | 38 - .../charts/grafana/templates/role.yaml | 32 - .../charts/grafana/templates/rolebinding.yaml | 25 - .../charts/grafana/templates/secret-env.yaml | 14 - .../charts/grafana/templates/secret.yaml | 26 - .../charts/grafana/templates/service.yaml | 55 - .../grafana/templates/serviceaccount.yaml | 17 - .../grafana/templates/servicemonitor.yaml | 68 - .../charts/grafana/templates/statefulset.yaml | 58 - .../templates/tests/test-configmap.yaml | 20 - .../tests/test-podsecuritypolicy.yaml | 32 - .../grafana/templates/tests/test-role.yaml | 17 - .../templates/tests/test-rolebinding.yaml | 20 - .../templates/tests/test-serviceaccount.yaml | 12 - .../charts/grafana/templates/tests/test.yaml | 49 - .../charts/grafana/values.yaml | 1256 ----- .../charts/hardenedKubelet/.helmignore | 23 - .../charts/hardenedKubelet/Chart.yaml | 14 - .../charts/hardenedKubelet/README.md | 90 - .../hardenedKubelet/templates/_helpers.tpl | 166 - .../templates/pushprox-clients-rbac.yaml | 97 - .../templates/pushprox-clients.yaml | 157 - .../templates/pushprox-proxy-rbac.yaml | 68 - .../templates/pushprox-proxy.yaml | 57 - .../templates/pushprox-servicemonitor.yaml | 45 - .../templates/validate-install-crd.yaml | 14 - .../templates/validate-psp-install.yaml | 7 - .../charts/hardenedKubelet/values.yaml | 166 - .../charts/hardenedNodeExporter/.helmignore | 23 - .../charts/hardenedNodeExporter/Chart.yaml | 14 - .../charts/hardenedNodeExporter/README.md | 90 - .../templates/_helpers.tpl | 166 - .../templates/pushprox-clients-rbac.yaml | 97 - .../templates/pushprox-clients.yaml | 157 - .../templates/pushprox-proxy-rbac.yaml | 68 - .../templates/pushprox-proxy.yaml | 57 - .../templates/pushprox-servicemonitor.yaml | 45 - .../templates/validate-install-crd.yaml | 14 - .../templates/validate-psp-install.yaml | 7 - .../charts/hardenedNodeExporter/values.yaml | 166 - .../charts/k3sServer/.helmignore | 23 - .../charts/k3sServer/Chart.yaml | 14 - .../charts/k3sServer/README.md | 90 - .../charts/k3sServer/templates/_helpers.tpl | 166 - .../templates/pushprox-clients-rbac.yaml | 97 - .../k3sServer/templates/pushprox-clients.yaml | 157 - .../templates/pushprox-proxy-rbac.yaml | 68 - .../k3sServer/templates/pushprox-proxy.yaml | 57 - .../templates/pushprox-servicemonitor.yaml | 45 - .../templates/validate-install-crd.yaml | 14 - .../templates/validate-psp-install.yaml | 7 - .../charts/k3sServer/values.yaml | 166 - .../charts/kube-state-metrics/.helmignore | 21 - .../charts/kube-state-metrics/Chart.yaml | 28 - .../charts/kube-state-metrics/README.md | 85 - .../kube-state-metrics/templates/NOTES.txt | 23 - .../kube-state-metrics/templates/_helpers.tpl | 196 - .../templates/ciliumnetworkpolicy.yaml | 33 - .../templates/clusterrolebinding.yaml | 20 - .../templates/crs-configmap.yaml | 9 - .../templates/deployment.yaml | 278 - .../templates/kubeconfig-secret.yaml | 12 - .../templates/networkpolicy.yaml | 43 - .../kube-state-metrics/templates/pdb.yaml | 18 - .../templates/podsecuritypolicy.yaml | 39 - .../templates/psp-clusterrole.yaml | 19 - .../templates/psp-clusterrolebinding.yaml | 16 - .../templates/rbac-configmap.yaml | 15 - .../kube-state-metrics/templates/role.yaml | 215 - .../templates/rolebinding.yaml | 24 - .../kube-state-metrics/templates/service.yaml | 49 - .../templates/serviceaccount.yaml | 15 - .../templates/servicemonitor.yaml | 113 - .../templates/stsdiscovery-role.yaml | 26 - .../templates/stsdiscovery-rolebinding.yaml | 17 - .../templates/verticalpodautoscaler.yaml | 38 - .../charts/kube-state-metrics/values.yaml | 417 -- .../kubeAdmControllerManager/.helmignore | 23 - .../kubeAdmControllerManager/Chart.yaml | 14 - .../charts/kubeAdmControllerManager/README.md | 90 - .../templates/_helpers.tpl | 166 - .../templates/pushprox-clients-rbac.yaml | 97 - .../templates/pushprox-clients.yaml | 157 - .../templates/pushprox-proxy-rbac.yaml | 68 - .../templates/pushprox-proxy.yaml | 57 - .../templates/pushprox-servicemonitor.yaml | 45 - .../templates/validate-install-crd.yaml | 14 - .../templates/validate-psp-install.yaml | 7 - .../kubeAdmControllerManager/values.yaml | 166 - .../charts/kubeAdmEtcd/.helmignore | 23 - .../charts/kubeAdmEtcd/Chart.yaml | 14 - .../charts/kubeAdmEtcd/README.md | 90 - .../charts/kubeAdmEtcd/templates/_helpers.tpl | 166 - .../templates/pushprox-clients-rbac.yaml | 97 - .../templates/pushprox-clients.yaml | 157 - .../templates/pushprox-proxy-rbac.yaml | 68 - .../kubeAdmEtcd/templates/pushprox-proxy.yaml | 57 - .../templates/pushprox-servicemonitor.yaml | 45 - .../templates/validate-install-crd.yaml | 14 - .../templates/validate-psp-install.yaml | 7 - .../charts/kubeAdmEtcd/values.yaml | 166 - .../charts/kubeAdmProxy/.helmignore | 23 - .../charts/kubeAdmProxy/Chart.yaml | 14 - .../charts/kubeAdmProxy/README.md | 90 - .../kubeAdmProxy/templates/_helpers.tpl | 166 - .../templates/pushprox-clients-rbac.yaml | 97 - .../templates/pushprox-clients.yaml | 157 - .../templates/pushprox-proxy-rbac.yaml | 68 - .../templates/pushprox-proxy.yaml | 57 - .../templates/pushprox-servicemonitor.yaml | 45 - .../templates/validate-install-crd.yaml | 14 - .../templates/validate-psp-install.yaml | 7 - .../charts/kubeAdmProxy/values.yaml | 166 - .../charts/kubeAdmScheduler/.helmignore | 23 - .../charts/kubeAdmScheduler/Chart.yaml | 14 - .../charts/kubeAdmScheduler/README.md | 90 - .../kubeAdmScheduler/templates/_helpers.tpl | 166 - .../templates/pushprox-clients-rbac.yaml | 97 - .../templates/pushprox-clients.yaml | 157 - .../templates/pushprox-proxy-rbac.yaml | 68 - .../templates/pushprox-proxy.yaml | 57 - .../templates/pushprox-servicemonitor.yaml | 45 - .../templates/validate-install-crd.yaml | 14 - .../templates/validate-psp-install.yaml | 7 - .../charts/kubeAdmScheduler/values.yaml | 166 - .../charts/prometheus-adapter/.helmignore | 21 - .../charts/prometheus-adapter/Chart.yaml | 27 - .../charts/prometheus-adapter/README.md | 160 - .../prometheus-adapter/templates/NOTES.txt | 9 - .../prometheus-adapter/templates/_helpers.tpl | 113 - .../templates/certmanager.yaml | 76 - .../cluster-role-binding-auth-delegator.yaml | 20 - .../cluster-role-binding-resource-reader.yaml | 20 - .../cluster-role-resource-reader.yaml | 24 - .../templates/configmap.yaml | 97 - .../templates/custom-metrics-apiservice.yaml | 34 - ...stom-metrics-cluster-role-binding-hpa.yaml | 24 - .../custom-metrics-cluster-role.yaml | 17 - .../templates/deployment.yaml | 144 - .../external-metrics-apiservice.yaml | 34 - ...rnal-metrics-cluster-role-binding-hpa.yaml | 20 - .../external-metrics-cluster-role.yaml | 21 - .../prometheus-adapter/templates/pdb.yaml | 23 - .../prometheus-adapter/templates/psp.yaml | 66 - .../resource-metrics-apiservice.yaml | 34 - ...resource-metrics-cluster-role-binding.yaml | 20 - .../resource-metrics-cluster-role.yaml | 23 - .../templates/role-binding-auth-reader.yaml | 21 - .../prometheus-adapter/templates/secret.yaml | 17 - .../prometheus-adapter/templates/service.yaml | 27 - .../templates/serviceaccount.yaml | 18 - .../charts/prometheus-adapter/values.yaml | 277 - .../prometheus-node-exporter/.helmignore | 21 - .../prometheus-node-exporter/Chart.yaml | 19 - .../charts/prometheus-node-exporter/README.md | 100 - .../templates/NOTES.txt | 29 - .../templates/_helpers.tpl | 219 - .../templates/clusterrole.yaml | 20 - .../templates/clusterrolebinding.yaml | 20 - .../templates/daemonset.yaml | 285 - .../templates/endpoints.yaml | 18 - .../templates/extra-manifests.yaml | 4 - .../templates/networkpolicy.yaml | 23 - .../templates/podmonitor.yaml | 91 - .../templates/psp-clusterrole.yaml | 14 - .../templates/psp-clusterrolebinding.yaml | 16 - .../templates/psp.yaml | 49 - .../templates/rbac-configmap.yaml | 15 - .../templates/service.yaml | 23 - .../templates/serviceaccount.yaml | 17 - .../templates/servicemonitor.yaml | 71 - .../templates/verticalpodautoscaler.yaml | 40 - .../prometheus-node-exporter/values.yaml | 475 -- .../charts/rke2ControllerManager/.helmignore | 23 - .../charts/rke2ControllerManager/Chart.yaml | 14 - .../charts/rke2ControllerManager/README.md | 90 - .../templates/_helpers.tpl | 166 - .../templates/pushprox-clients-rbac.yaml | 97 - .../templates/pushprox-clients.yaml | 157 - .../templates/pushprox-proxy-rbac.yaml | 68 - .../templates/pushprox-proxy.yaml | 57 - .../templates/pushprox-servicemonitor.yaml | 45 - .../templates/validate-install-crd.yaml | 14 - .../templates/validate-psp-install.yaml | 7 - .../charts/rke2ControllerManager/values.yaml | 166 - .../charts/rke2Etcd/.helmignore | 23 - .../charts/rke2Etcd/Chart.yaml | 14 - .../charts/rke2Etcd/README.md | 90 - .../charts/rke2Etcd/templates/_helpers.tpl | 166 - .../templates/pushprox-clients-rbac.yaml | 97 - .../rke2Etcd/templates/pushprox-clients.yaml | 157 - .../templates/pushprox-proxy-rbac.yaml | 68 - .../rke2Etcd/templates/pushprox-proxy.yaml | 57 - .../templates/pushprox-servicemonitor.yaml | 45 - .../templates/validate-install-crd.yaml | 14 - .../templates/validate-psp-install.yaml | 7 - .../charts/rke2Etcd/values.yaml | 166 - .../charts/rke2IngressNginx/.helmignore | 23 - .../charts/rke2IngressNginx/Chart.yaml | 14 - .../charts/rke2IngressNginx/README.md | 90 - .../rke2IngressNginx/templates/_helpers.tpl | 166 - .../templates/pushprox-clients-rbac.yaml | 97 - .../templates/pushprox-clients.yaml | 157 - .../templates/pushprox-proxy-rbac.yaml | 68 - .../templates/pushprox-proxy.yaml | 57 - .../templates/pushprox-servicemonitor.yaml | 45 - .../templates/validate-install-crd.yaml | 14 - .../templates/validate-psp-install.yaml | 7 - .../charts/rke2IngressNginx/values.yaml | 166 - .../charts/rke2Proxy/.helmignore | 23 - .../charts/rke2Proxy/Chart.yaml | 14 - .../charts/rke2Proxy/README.md | 90 - .../charts/rke2Proxy/templates/_helpers.tpl | 166 - .../templates/pushprox-clients-rbac.yaml | 97 - .../rke2Proxy/templates/pushprox-clients.yaml | 157 - .../templates/pushprox-proxy-rbac.yaml | 68 - .../rke2Proxy/templates/pushprox-proxy.yaml | 57 - .../templates/pushprox-servicemonitor.yaml | 45 - .../templates/validate-install-crd.yaml | 14 - .../templates/validate-psp-install.yaml | 7 - .../charts/rke2Proxy/values.yaml | 166 - .../charts/rke2Scheduler/.helmignore | 23 - .../charts/rke2Scheduler/Chart.yaml | 14 - .../charts/rke2Scheduler/README.md | 90 - .../rke2Scheduler/templates/_helpers.tpl | 166 - .../templates/pushprox-clients-rbac.yaml | 97 - .../templates/pushprox-clients.yaml | 157 - .../templates/pushprox-proxy-rbac.yaml | 68 - .../templates/pushprox-proxy.yaml | 57 - .../templates/pushprox-servicemonitor.yaml | 45 - .../templates/validate-install-crd.yaml | 14 - .../templates/validate-psp-install.yaml | 7 - .../charts/rke2Scheduler/values.yaml | 166 - .../charts/rkeControllerManager/.helmignore | 23 - .../charts/rkeControllerManager/Chart.yaml | 14 - .../charts/rkeControllerManager/README.md | 90 - .../templates/_helpers.tpl | 166 - .../templates/pushprox-clients-rbac.yaml | 97 - .../templates/pushprox-clients.yaml | 157 - .../templates/pushprox-proxy-rbac.yaml | 68 - .../templates/pushprox-proxy.yaml | 57 - .../templates/pushprox-servicemonitor.yaml | 45 - .../templates/validate-install-crd.yaml | 14 - .../templates/validate-psp-install.yaml | 7 - .../charts/rkeControllerManager/values.yaml | 166 - .../charts/rkeEtcd/.helmignore | 23 - .../charts/rkeEtcd/Chart.yaml | 14 - .../charts/rkeEtcd/README.md | 90 - .../charts/rkeEtcd/templates/_helpers.tpl | 166 - .../templates/pushprox-clients-rbac.yaml | 97 - .../rkeEtcd/templates/pushprox-clients.yaml | 157 - .../templates/pushprox-proxy-rbac.yaml | 68 - .../rkeEtcd/templates/pushprox-proxy.yaml | 57 - .../templates/pushprox-servicemonitor.yaml | 45 - .../templates/validate-install-crd.yaml | 14 - .../templates/validate-psp-install.yaml | 7 - .../charts/rkeEtcd/values.yaml | 166 - .../charts/rkeIngressNginx/.helmignore | 23 - .../charts/rkeIngressNginx/Chart.yaml | 14 - .../charts/rkeIngressNginx/README.md | 90 - .../rkeIngressNginx/templates/_helpers.tpl | 166 - .../templates/pushprox-clients-rbac.yaml | 97 - .../templates/pushprox-clients.yaml | 157 - .../templates/pushprox-proxy-rbac.yaml | 68 - .../templates/pushprox-proxy.yaml | 57 - .../templates/pushprox-servicemonitor.yaml | 45 - .../templates/validate-install-crd.yaml | 14 - .../templates/validate-psp-install.yaml | 7 - .../charts/rkeIngressNginx/values.yaml | 166 - .../charts/rkeProxy/.helmignore | 23 - .../charts/rkeProxy/Chart.yaml | 14 - .../charts/rkeProxy/README.md | 90 - .../charts/rkeProxy/templates/_helpers.tpl | 166 - .../templates/pushprox-clients-rbac.yaml | 97 - .../rkeProxy/templates/pushprox-clients.yaml | 157 - .../templates/pushprox-proxy-rbac.yaml | 68 - .../rkeProxy/templates/pushprox-proxy.yaml | 57 - .../templates/pushprox-servicemonitor.yaml | 45 - .../templates/validate-install-crd.yaml | 14 - .../templates/validate-psp-install.yaml | 7 - .../charts/rkeProxy/values.yaml | 166 - .../charts/rkeScheduler/.helmignore | 23 - .../charts/rkeScheduler/Chart.yaml | 14 - .../charts/rkeScheduler/README.md | 90 - .../rkeScheduler/templates/_helpers.tpl | 166 - .../templates/pushprox-clients-rbac.yaml | 97 - .../templates/pushprox-clients.yaml | 157 - .../templates/pushprox-proxy-rbac.yaml | 68 - .../templates/pushprox-proxy.yaml | 57 - .../templates/pushprox-servicemonitor.yaml | 45 - .../templates/validate-install-crd.yaml | 14 - .../templates/validate-psp-install.yaml | 7 - .../charts/rkeScheduler/values.yaml | 166 - .../charts/windowsExporter/.helmignore | 23 - .../charts/windowsExporter/Chart.yaml | 15 - .../charts/windowsExporter/README.md | 17 - .../scripts/configure-firewall.ps1 | 31 - .../scripts/ensure-9796-is-free.ps1 | 28 - .../windowsExporter/templates/_helpers.tpl | 107 - .../windowsExporter/templates/configmap.yaml | 10 - .../windowsExporter/templates/daemonset.yaml | 62 - .../templates/prometheusrule.yaml | 13 - .../windowsExporter/templates/rbac.yaml | 81 - .../windowsExporter/templates/service.yaml | 15 - .../templates/servicemonitor.yaml | 41 - .../charts/windowsExporter/values.yaml | 57 - .../files/ingress-nginx/nginx.json | 1445 ----- .../request-handling-performance.json | 963 ---- .../cluster/rancher-cluster-nodes.json | 793 --- .../rancher/cluster/rancher-cluster.json | 776 --- .../rancher/home/rancher-default-home.json | 1290 ----- .../files/rancher/k8s/rancher-etcd-nodes.json | 687 --- .../files/rancher/k8s/rancher-etcd.json | 669 --- .../k8s/rancher-k8s-components-nodes.json | 527 -- .../rancher/k8s/rancher-k8s-components.json | 519 -- .../rancher/nodes/rancher-node-detail.json | 805 --- .../files/rancher/nodes/rancher-node.json | 792 --- .../performance/performance-debugging.json | 1652 ------ .../rancher/pods/rancher-pod-containers.json | 636 --- .../files/rancher/pods/rancher-pod.json | 636 --- .../workloads/rancher-workload-pods.json | 652 --- .../rancher/workloads/rancher-workload.json | 652 --- .../delete-workloads-with-old-labels.sh | 14 - .../103.1.2+up45.31.1/templates/NOTES.txt | 4 - .../103.1.2+up45.31.1/templates/_helpers.tpl | 423 -- .../templates/alertmanager/alertmanager.yaml | 175 - .../templates/alertmanager/extrasecret.yaml | 20 - .../templates/alertmanager/ingress.yaml | 78 - .../alertmanager/ingressperreplica.yaml | 67 - .../alertmanager/podDisruptionBudget.yaml | 21 - .../templates/alertmanager/psp-role.yaml | 23 - .../alertmanager/psp-rolebinding.yaml | 20 - .../templates/alertmanager/psp.yaml | 47 - .../templates/alertmanager/secret.yaml | 35 - .../templates/alertmanager/service.yaml | 56 - .../alertmanager/serviceaccount.yaml | 21 - .../alertmanager/servicemonitor.yaml | 60 - .../alertmanager/serviceperreplica.yaml | 49 - .../templates/exporters/core-dns/service.yaml | 24 - .../exporters/core-dns/servicemonitor.yaml | 50 - .../kube-api-server/servicemonitor.yaml | 53 - .../kube-controller-manager/endpoints.yaml | 22 - .../kube-controller-manager/service.yaml | 29 - .../servicemonitor.yaml | 61 - .../templates/exporters/kube-dns/service.yaml | 28 - .../exporters/kube-dns/servicemonitor.yaml | 63 - .../exporters/kube-etcd/endpoints.yaml | 20 - .../exporters/kube-etcd/service.yaml | 27 - .../exporters/kube-etcd/servicemonitor.yaml | 67 - .../exporters/kube-proxy/endpoints.yaml | 20 - .../exporters/kube-proxy/service.yaml | 27 - .../exporters/kube-proxy/servicemonitor.yaml | 55 - .../exporters/kube-scheduler/endpoints.yaml | 22 - .../exporters/kube-scheduler/service.yaml | 29 - .../kube-scheduler/servicemonitor.yaml | 61 - .../kube-state-metrics/validate.yaml | 7 - .../exporters/kubelet/servicemonitor.yaml | 230 - .../exporters/node-exporter/validate.yaml | 3 - .../grafana/configmap-dashboards.yaml | 24 - .../grafana/configmaps-datasources.yaml | 67 - .../alertmanager-overview.yaml | 616 --- .../grafana/dashboards-1.14/apiserver.yaml | 1772 ------- .../dashboards-1.14/cluster-total.yaml | 1882 ------- .../dashboards-1.14/controller-manager.yaml | 1196 ----- .../grafana/dashboards-1.14/etcd.yaml | 1229 ----- .../dashboards-1.14/grafana-overview.yaml | 635 --- .../grafana/dashboards-1.14/k8s-coredns.yaml | 1530 ------ .../k8s-resources-cluster.yaml | 3088 ----------- .../k8s-resources-namespace.yaml | 2797 ---------- .../dashboards-1.14/k8s-resources-node.yaml | 1026 ---- .../dashboards-1.14/k8s-resources-pod.yaml | 2469 --------- .../k8s-resources-workload.yaml | 2024 ------- .../k8s-resources-workloads-namespace.yaml | 2189 -------- .../grafana/dashboards-1.14/kubelet.yaml | 2256 -------- .../dashboards-1.14/namespace-by-pod.yaml | 1464 ------ .../namespace-by-workload.yaml | 1736 ------ .../node-cluster-rsrc-use.yaml | 1063 ---- .../dashboards-1.14/node-rsrc-use.yaml | 1089 ---- .../grafana/dashboards-1.14/nodes-darwin.yaml | 1073 ---- .../grafana/dashboards-1.14/nodes.yaml | 1066 ---- .../persistentvolumesusage.yaml | 587 --- .../grafana/dashboards-1.14/pod-total.yaml | 1228 ----- .../prometheus-remote-write.yaml | 1674 ------ .../grafana/dashboards-1.14/prometheus.yaml | 1235 ----- .../grafana/dashboards-1.14/proxy.yaml | 1276 ----- .../grafana/dashboards-1.14/scheduler.yaml | 1118 ---- .../dashboards-1.14/workload-total.yaml | 1438 ----- .../templates/grafana/namespaces.yaml | 13 - .../ciliumnetworkpolicy-createSecret.yaml | 32 - .../ciliumnetworkpolicy-patchWebhook.yaml | 33 - .../job-patch/clusterrole.yaml | 33 - .../job-patch/clusterrolebinding.yaml | 20 - .../job-patch/job-createSecret.yaml | 73 - .../job-patch/job-patchWebhook.yaml | 74 - .../job-patch/networkpolicy-createSecret.yaml | 29 - .../job-patch/networkpolicy-patchWebhook.yaml | 29 - .../admission-webhooks/job-patch/psp.yaml | 47 - .../admission-webhooks/job-patch/role.yaml | 21 - .../job-patch/rolebinding.yaml | 21 - .../job-patch/serviceaccount.yaml | 17 - .../mutatingWebhookConfiguration.yaml | 69 - .../validatingWebhookConfiguration.yaml | 69 - .../prometheus-operator/certmanager.yaml | 57 - .../ciliumnetworkpolicy.yaml | 35 - .../prometheus-operator/clusterrole.yaml | 92 - .../clusterrolebinding.yaml | 17 - .../prometheus-operator/deployment.yaml | 183 - .../prometheus-operator/networkpolicy.yaml | 27 - .../prometheus-operator/psp-clusterrole.yaml | 22 - .../psp-clusterrolebinding.yaml | 19 - .../templates/prometheus-operator/psp.yaml | 47 - .../prometheus-operator/service.yaml | 58 - .../prometheus-operator/serviceaccount.yaml | 16 - .../prometheus-operator/servicemonitor.yaml | 58 - .../verticalpodautoscaler.yaml | 35 - .../templates/prometheus/_rules.tpl | 36 - .../additionalAlertRelabelConfigs.yaml | 16 - .../additionalAlertmanagerConfigs.yaml | 16 - .../prometheus/additionalPrometheusRules.yaml | 43 - .../prometheus/additionalScrapeConfigs.yaml | 20 - .../prometheus/ciliumnetworkpolicy.yaml | 27 - .../templates/prometheus/clusterrole.yaml | 30 - .../prometheus/clusterrolebinding.yaml | 18 - .../templates/prometheus/csi-secret.yaml | 12 - .../templates/prometheus/extrasecret.yaml | 20 - .../templates/prometheus/ingress.yaml | 77 - .../prometheus/ingressThanosSidecar.yaml | 77 - .../prometheus/ingressperreplica.yaml | 67 - .../templates/prometheus/networkpolicy.yaml | 30 - .../templates/prometheus/nginx-config.yaml | 68 - .../prometheus/podDisruptionBudget.yaml | 21 - .../templates/prometheus/podmonitors.yaml | 38 - .../templates/prometheus/prometheus.yaml | 404 -- .../templates/prometheus/psp-clusterrole.yaml | 22 - .../prometheus/psp-clusterrolebinding.yaml | 19 - .../templates/prometheus/psp.yaml | 58 - .../rules-1.14/alertmanager.rules.yaml | 217 - .../rules-1.14/config-reloaders.yaml | 46 - .../templates/prometheus/rules-1.14/etcd.yaml | 296 -- .../prometheus/rules-1.14/general.rules.yaml | 98 - .../prometheus/rules-1.14/k8s.rules.yaml | 237 - .../kube-apiserver-availability.rules.yaml | 193 - .../kube-apiserver-burnrate.rules.yaml | 370 -- .../kube-apiserver-histogram.rules.yaml | 43 - .../rules-1.14/kube-apiserver-slos.yaml | 115 - .../kube-prometheus-general.rules.yaml | 39 - .../kube-prometheus-node-recording.rules.yaml | 63 - .../rules-1.14/kube-scheduler.rules.yaml | 90 - .../rules-1.14/kube-state-metrics.yaml | 107 - .../prometheus/rules-1.14/kubelet.rules.yaml | 50 - .../rules-1.14/kubernetes-apps.yaml | 375 -- .../rules-1.14/kubernetes-resources.yaml | 193 - .../rules-1.14/kubernetes-storage.yaml | 160 - .../kubernetes-system-apiserver.yaml | 130 - .../kubernetes-system-controller-manager.yaml | 47 - .../kubernetes-system-kube-proxy.yaml | 46 - .../rules-1.14/kubernetes-system-kubelet.yaml | 253 - .../kubernetes-system-scheduler.yaml | 46 - .../rules-1.14/kubernetes-system.yaml | 65 - .../rules-1.14/node-exporter.rules.yaml | 133 - .../prometheus/rules-1.14/node-exporter.yaml | 398 -- .../prometheus/rules-1.14/node-network.yaml | 44 - .../prometheus/rules-1.14/node.rules.yaml | 83 - .../rules-1.14/prometheus-operator.yaml | 148 - .../prometheus/rules-1.14/prometheus.yaml | 448 -- .../templates/prometheus/service.yaml | 64 - .../prometheus/serviceThanosSidecar.yaml | 39 - .../serviceThanosSidecarExternal.yaml | 46 - .../templates/prometheus/serviceaccount.yaml | 20 - .../templates/prometheus/servicemonitor.yaml | 56 - .../servicemonitorThanosSidecar.yaml | 55 - .../templates/prometheus/servicemonitors.yaml | 39 - .../prometheus/serviceperreplica.yaml | 49 - .../rancher-monitoring/clusterrole.yaml | 135 - .../rancher-monitoring/config-role.yaml | 48 - .../rancher-monitoring/dashboard-role.yaml | 47 - .../addons/ingress-nginx-dashboard.yaml | 18 - .../rancher/cluster-dashboards.yaml | 17 - .../dashboards/rancher/default-dashboard.yaml | 17 - .../dashboards/rancher/k8s-dashboards.yaml | 31 - .../dashboards/rancher/nodes-dashboards.yaml | 17 - .../rancher/performance-dashboards.yaml | 18 - .../dashboards/rancher/pods-dashboards.yaml | 17 - .../rancher/workload-dashboards.yaml | 17 - .../exporters/ingress-nginx/service.yaml | 27 - .../ingress-nginx/servicemonitor.yaml | 49 - .../exporters/rancher/servicemonitor.yaml | 58 - .../rancher-monitoring/hardened.yaml | 147 - .../rancher-monitoring/upgrade/configmap.yaml | 13 - .../rancher-monitoring/upgrade/job.yaml | 46 - .../rancher-monitoring/upgrade/rbac.yaml | 131 - .../templates/thanos-ruler/extrasecret.yaml | 20 - .../templates/thanos-ruler/ingress.yaml | 77 - .../thanos-ruler/podDisruptionBudget.yaml | 21 - .../templates/thanos-ruler/ruler.yaml | 173 - .../templates/thanos-ruler/service.yaml | 53 - .../thanos-ruler/serviceaccount.yaml | 20 - .../thanos-ruler/servicemonitor.yaml | 60 - .../templates/validate-install-crd.yaml | 21 - .../templates/validate-psp-install.yaml | 7 - .../103.1.2+up45.31.1/values.yaml | 4679 ----------------- index.yaml | 128 - 535 files changed, 96363 deletions(-) delete mode 100644 assets/rancher-monitoring/rancher-monitoring-103.1.2+up45.31.1.tgz delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/CHANGELOG.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/CONTRIBUTING.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/app-README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/dashboards/custom-dashboard.json delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/NOTES.txt delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/_pod.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/clusterrole.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/clusterrolebinding.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/configmap-dashboard-provider.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/configmap.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/dashboards-json-configmap.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/deployment.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/extra-manifests.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/headless-service.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/hpa.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-deployment.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-hpa.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-network-policy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-service.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/ingress.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/networkpolicy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/nginx-config.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/poddisruptionbudget.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/podsecuritypolicy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/pvc.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/role.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/rolebinding.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/secret-env.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/secret.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/service.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/serviceaccount.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/statefulset.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-configmap.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-podsecuritypolicy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-role.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-rolebinding.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-serviceaccount.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-clients-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-clients.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-proxy-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/validate-install-crd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-clients-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-clients.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-proxy-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/validate-install-crd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-clients-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-clients.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-proxy-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/validate-install-crd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/NOTES.txt delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/ciliumnetworkpolicy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/clusterrolebinding.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/crs-configmap.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/deployment.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/kubeconfig-secret.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/networkpolicy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/pdb.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/podsecuritypolicy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/psp-clusterrole.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/psp-clusterrolebinding.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/rbac-configmap.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/role.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/rolebinding.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/service.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/serviceaccount.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/stsdiscovery-role.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/stsdiscovery-rolebinding.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/verticalpodautoscaler.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-clients-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-clients.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-proxy-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/validate-install-crd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-clients-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-clients.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-proxy-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/validate-install-crd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-clients-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-clients.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-proxy-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/validate-install-crd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-clients-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-clients.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-proxy-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/validate-install-crd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/NOTES.txt delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/certmanager.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/cluster-role-binding-auth-delegator.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/cluster-role-binding-resource-reader.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/cluster-role-resource-reader.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/configmap.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/custom-metrics-apiservice.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/custom-metrics-cluster-role-binding-hpa.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/custom-metrics-cluster-role.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/deployment.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/external-metrics-apiservice.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/external-metrics-cluster-role-binding-hpa.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/external-metrics-cluster-role.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/pdb.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/psp.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/resource-metrics-apiservice.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/resource-metrics-cluster-role-binding.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/resource-metrics-cluster-role.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/role-binding-auth-reader.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/secret.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/service.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/serviceaccount.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/NOTES.txt delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/clusterrole.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/clusterrolebinding.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/daemonset.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/endpoints.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/extra-manifests.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/networkpolicy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/podmonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/psp-clusterrole.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/psp-clusterrolebinding.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/psp.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/rbac-configmap.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/service.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/serviceaccount.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/verticalpodautoscaler.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-clients-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-clients.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-proxy-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/validate-install-crd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-clients-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-clients.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-proxy-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/validate-install-crd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-clients-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-clients.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-proxy-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/validate-install-crd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-clients-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-clients.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-proxy-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/validate-install-crd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-clients-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-clients.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-proxy-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/validate-install-crd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-clients-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-clients.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-proxy-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/validate-install-crd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-clients-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-clients.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-proxy-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/validate-install-crd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-clients-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-clients.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-proxy-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/validate-install-crd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-clients-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-clients.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-proxy-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/validate-install-crd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-clients-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-clients.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-proxy-rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/validate-install-crd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/.helmignore delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/Chart.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/README.md delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/scripts/configure-firewall.ps1 delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/scripts/ensure-9796-is-free.ps1 delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/configmap.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/daemonset.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/prometheusrule.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/service.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/values.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/files/ingress-nginx/nginx.json delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/files/ingress-nginx/request-handling-performance.json delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/cluster/rancher-cluster-nodes.json delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/cluster/rancher-cluster.json delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/home/rancher-default-home.json delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/k8s/rancher-etcd-nodes.json delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/k8s/rancher-etcd.json delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/k8s/rancher-k8s-components-nodes.json delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/k8s/rancher-k8s-components.json delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/nodes/rancher-node-detail.json delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/nodes/rancher-node.json delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/performance/performance-debugging.json delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/pods/rancher-pod-containers.json delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/pods/rancher-pod.json delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/workloads/rancher-workload-pods.json delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/workloads/rancher-workload.json delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/files/upgrade/scripts/delete-workloads-with-old-labels.sh delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/NOTES.txt delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/_helpers.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/alertmanager.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/extrasecret.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/ingress.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/ingressperreplica.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/podDisruptionBudget.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/psp-role.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/psp-rolebinding.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/psp.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/secret.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/service.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/serviceaccount.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/serviceperreplica.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/core-dns/service.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/core-dns/servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-api-server/servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-controller-manager/endpoints.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-controller-manager/service.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-controller-manager/servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-dns/service.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-dns/servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-etcd/endpoints.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-etcd/service.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-etcd/servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-proxy/endpoints.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-proxy/service.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-proxy/servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-scheduler/endpoints.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-scheduler/service.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-scheduler/servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-state-metrics/validate.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kubelet/servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/node-exporter/validate.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/configmap-dashboards.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/configmaps-datasources.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/alertmanager-overview.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/apiserver.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/cluster-total.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/controller-manager.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/etcd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/grafana-overview.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-coredns.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-cluster.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-namespace.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-node.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-pod.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-workload.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-workloads-namespace.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/kubelet.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/namespace-by-pod.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/namespace-by-workload.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/node-cluster-rsrc-use.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/node-rsrc-use.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/nodes-darwin.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/nodes.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/persistentvolumesusage.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/pod-total.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/prometheus-remote-write.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/prometheus.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/scheduler.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/workload-total.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/namespaces.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/ciliumnetworkpolicy-createSecret.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/ciliumnetworkpolicy-patchWebhook.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/clusterrole.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/clusterrolebinding.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/job-createSecret.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/job-patchWebhook.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/networkpolicy-createSecret.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/networkpolicy-patchWebhook.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/psp.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/role.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/rolebinding.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/serviceaccount.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/mutatingWebhookConfiguration.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/validatingWebhookConfiguration.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/certmanager.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/ciliumnetworkpolicy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/clusterrole.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/clusterrolebinding.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/deployment.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/networkpolicy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/psp-clusterrole.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/psp-clusterrolebinding.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/psp.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/service.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/serviceaccount.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/verticalpodautoscaler.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/_rules.tpl delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/additionalAlertRelabelConfigs.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/additionalAlertmanagerConfigs.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/additionalPrometheusRules.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/additionalScrapeConfigs.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/ciliumnetworkpolicy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/clusterrole.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/clusterrolebinding.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/csi-secret.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/extrasecret.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/ingress.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/ingressThanosSidecar.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/ingressperreplica.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/networkpolicy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/nginx-config.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/podDisruptionBudget.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/podmonitors.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/prometheus.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/psp-clusterrole.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/psp-clusterrolebinding.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/psp.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/alertmanager.rules.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/config-reloaders.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/etcd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/general.rules.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/k8s.rules.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-apiserver-availability.rules.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-apiserver-burnrate.rules.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-apiserver-histogram.rules.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-apiserver-slos.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-prometheus-general.rules.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-prometheus-node-recording.rules.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-scheduler.rules.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-state-metrics.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubelet.rules.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-apps.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-resources.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-storage.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-apiserver.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-controller-manager.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-kube-proxy.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-kubelet.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-scheduler.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/node-exporter.rules.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/node-exporter.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/node-network.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/node.rules.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/prometheus-operator.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/prometheus.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/service.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/serviceThanosSidecar.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/serviceThanosSidecarExternal.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/serviceaccount.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/servicemonitorThanosSidecar.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/servicemonitors.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/serviceperreplica.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/clusterrole.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/config-role.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboard-role.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/addons/ingress-nginx-dashboard.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/cluster-dashboards.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/default-dashboard.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/k8s-dashboards.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/nodes-dashboards.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/performance-dashboards.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/pods-dashboards.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/workload-dashboards.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/exporters/ingress-nginx/service.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/exporters/ingress-nginx/servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/exporters/rancher/servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/hardened.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/upgrade/configmap.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/upgrade/job.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/upgrade/rbac.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/extrasecret.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/ingress.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/podDisruptionBudget.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/ruler.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/service.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/serviceaccount.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/servicemonitor.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/validate-install-crd.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/templates/validate-psp-install.yaml delete mode 100644 charts/rancher-monitoring/103.1.2+up45.31.1/values.yaml diff --git a/assets/rancher-monitoring/rancher-monitoring-103.1.2+up45.31.1.tgz b/assets/rancher-monitoring/rancher-monitoring-103.1.2+up45.31.1.tgz deleted file mode 100644 index fe1f353185f45bfa3760dbd092032072cbe263e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 440952 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

B&;H&5X7{6_VT~}zW-kjfBxdp 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

    Es6tH2PG>ztVikCn*(c3e$*Vpeqq&_ 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

    7VPiI1z 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%0DS;)H=U-cDUVu&J$GYd%z6Y?EXcy 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 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/.helmignore deleted file mode 100644 index 1937f42c7f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/.helmignore +++ /dev/null @@ -1,28 +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 -# helm/charts -OWNERS -hack/ -ci/ -kube-prometheus-*.tgz - -unittests/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/CHANGELOG.md b/charts/rancher-monitoring/103.1.2+up45.31.1/CHANGELOG.md deleted file mode 100644 index 8178169b91..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/CHANGELOG.md +++ /dev/null @@ -1,47 +0,0 @@ -# Changelog -All notable changes from the upstream Prometheus Operator chart will be added to this file. - -## [Package Version 00] - 2020-07-19 -### Added -- Added [Prometheus Adapter](https://github.com/helm/charts/tree/master/stable/prometheus-adapter) as a dependency to the upstream Prometheus Operator chart to allow users to expose custom metrics from the default Prometheus instance deployed by this chart -- Remove `prometheus-operator/cleanup-crds.yaml` and `prometheus-operator/crds.yaml` from the Prometheus Operator upstream chart in favor of just using the CRD directory to install the CRDs. -- Added support for `rkeControllerManager`, `rkeScheduler`, `rkeProxy`, and `rkeEtcd` PushProx exporters for monitoring k8s components within RKE clusters -- Added support for a `k3sServer` PushProx exporter that monitors k3s server components (`kubeControllerManager`, `kubeScheduler`, and `kubeProxy`) within k3s clusters -- Added support for `kubeAdmControllerManager`, `kubeAdmScheduler`, `kubeAdmProxy`, and `kubeAdmEtcd` PushProx exporters for monitoring k8s components within kubeAdm clusters -- Added support for `rke2ControllerManager`, `rke2Scheduler`, `rke2Proxy`, and `rke2Etcd` PushProx exporters for monitoring k8s components within rke2 clusters -- Exposed `prometheus.prometheusSpec.ignoreNamespaceSelectors` on values.yaml and set it to `false` by default. This value instructs the default Prometheus server deployed with this chart to ignore the `namespaceSelector` field within any created ServiceMonitor or PodMonitor CRs that it selects. This prevents ServiceMonitors and PodMonitors from configuring the Prometheus scrape configuration to monitor resources outside the namespace that they are deployed in; if a user needs to have one ServiceMonitor / PodMonitor monitor resources within several namespaces (such as the resources that are used to monitor Istio in a default installation), they should not enable this option since it would require them to create one ServiceMonitor / PodMonitor CR per namespace that they would like to monitor. Relevant fields were also updated in the default README.md. -- Added `grafana.sidecar.dashboards.searchNamespace` to `values.yaml` with a default value of `cattle-dashboards`. The namespace provided should contain all ConfigMaps with the label `grafana_dashboard` and will be searched by the Grafana Dashboards sidecar for updates. The namespace specified is also created along with this deployment. All default dashboard ConfigMaps have been relocated from the deployment namespace to the namespace specified -- Added `monitoring-admin`, `monitoring-edit`, and `monitoring-view` default `ClusterRoles` to allow admins to assign roles to users to interact with Prometheus Operator CRs. These can be enabled by setting `.Values.global.rbac.userRoles.create` (default: `true`). In a typical RBAC setup, you might want to use a `ClusterRoleBinding` to bind these roles to a Subject to allow them to set up or view `ServiceMonitors` / `PodMonitors` / `PrometheusRules` and view `Prometheus` or `Alertmanager` CRs across the cluster. If `.Values.global.rbac.userRoles.aggregateRolesForRBAC` is enabled, these ClusterRoles will aggregate into the respective default ClusterRoles provided by Kubernetes -- Added `monitoring-config-admin`, `monitoring-config-edit` and `monitoring-config-view` default `Roles` to allow admins to assign roles to users to be able to edit / view `Secrets` and `ConfigMaps` within the `cattle-monitoring-system` namespace. These can be enabled by setting `.Values.global.rbac.userRoles.create` (default: `true`). In a typical RBAC setup, you might want to use a `RoleBinding` to bind these roles to a Subject within the `cattle-monitoring-system` namespace to allow them to modify Secrets / ConfigMaps tied to the deployment, such as your Alertmanager Config Secret. -- Added `monitoring-dashboard-admin`, `monitoring-dashboard-edit` and `monitoring-dashboard-view` default `Roles` to allow admins to assign roles to users to be able to edit / view `ConfigMaps` within the `cattle-dashboards` namespace. These can be enabled by setting `.Values.global.rbac.userRoles.create` (default: `true`) and deploying Grafana as part of this chart. In a typical RBAC setup, you might want to use a `RoleBinding` to bind these roles to a Subject within the `cattle-dashboards` namespace to allow them to create / modify ConfigMaps that contain the JSON used to persist Grafana Dashboards on the cluster. -- Added default resource limits for `Prometheus Operator`, `Prometheus`, `AlertManager`, `Grafana`, `kube-state-metrics`, `node-exporter` -- Added a default template `rancher_defaults.tmpl` to AlertManager that Rancher will offer to users in order to help configure the way alerts are rendered on a notifier. Also updated the default template deployed with this chart to reference that template and added an example of a Slack config using this template as a comment in the `values.yaml`. -- Added support for private registries via introducing a new field for `global.cattle.systemDefaultRegistry` that, if supplied, will automatically be prepended onto every image used by the chart. -- Added a default `nginx` proxy container deployed with Grafana whose config is set in the `ConfigMap` located in `charts/grafana/templates/nginx-config.yaml`. The purpose of this container is to make it possible to view Grafana's UI through a proxy that has a subpath (e.g. Rancher's proxy). This proxy container is set to listen on port `8080` (with a `portName` of `nginx-http` instead of the default `service`), which is also where the Grafana service will now point to, and will forward all requests to the Grafana container listening on the default port `3000`. -- Added a default `nginx` proxy container deployed with Prometheus whose config is set in the `ConfigMap` located in `templates/prometheus/nginx-config.yaml`. The purpose of this container is to make it possible to view Prometheus's UI through a proxy that has a subpath (e.g. Rancher's proxy). This proxy container is set to listen on port `8081` (with a `portName` of `nginx-http` instead of the default `web`), which is also where the Prometheus service will now point to, and will forward all requests to the Prometheus container listening on the default port `9090`. -- Added support for passing CIS Scans in a hardened cluster by introducing a Job that patches the default service account within the `cattle-monitoring-system` and `cattle-dashboards` namespaces on install or upgrade and adding a default allow all `NetworkPolicy` to the `cattle-monitoring-system` and `cattle-dashboards` namespaces. -### Modified -- Updated the chart name from `prometheus-operator` to `rancher-monitoring` and added the `io.rancher.certified: rancher` annotation to `Chart.yaml` -- Modified the default `node-exporter` port from `9100` to `9796` -- Modified the default `nameOverride` to `rancher-monitoring`. This change is necessary as the Prometheus Adapter's default URL (`http://{{ .Values.nameOverride }}-prometheus.{{ .Values.namespaceOverride }}.svc`) is based off of the value used here; if modified, the default Adapter URL must also be modified -- Modified the default `namespaceOverride` to `cattle-monitoring-system`. This change is necessary as the Prometheus Adapter's default URL (`http://{{ .Values.nameOverride }}-prometheus.{{ .Values.namespaceOverride }}.svc`) is based off of the value used here; if modified, the default Adapter URL must also be modified -- Configured some default values for `grafana.service` values and exposed them in the default README.md -- The default namespaces the following ServiceMonitors were changed from the deployment namespace to allow them to continue to monitor metrics when `prometheus.prometheusSpec.ignoreNamespaceSelectors` is enabled: - - `core-dns`: `kube-system` - - `api-server`: `default` - - `kube-controller-manager`: `kube-system` - - `kubelet`: `{{ .Values.kubelet.namespace }}` -- Disabled the following deployments by default (can be enabled if required): - - `AlertManager` - - `kube-controller-manager` metrics exporter - - `kube-etcd` metrics exporter - - `kube-scheduler` metrics exporter - - `kube-proxy` metrics exporter -- Updated default Grafana `deploymentStrategy` to `Recreate` to prevent deployments from being stuck on upgrade if a PV is attached to Grafana -- Modified the default `SelectorNilUsesHelmValues` to default to `false`. As a result, we look for all CRs with any labels in all namespaces by default rather than just the ones tagged with the label `release: rancher-monitoring`. -- Modified the default images used by the `rancher-monitoring` chart to point to Rancher mirrors of the original images from upstream. -- Modified the behavior of the chart to create the Alertmanager Config Secret via a pre-install hook instead of using the normal Helm lifecycle to manage the secret. The benefit of this approach is that all changes to the Config Secret done on a live cluster will never get overridden on a `helm upgrade` since the secret only gets created on a `helm install`. If you would like the secret to be cleaned up on an `helm uninstall`, enable `alertmanager.cleanupOnUninstall`; however, this is disabled by default to prevent the loss of alerting configuration on an uninstall. This secret will never be modified on a `helm upgrade`. -- Modified the default `securityContext` for `Pod` templates across the chart to `{"runAsNonRoot": "true", "runAsUser": "1000"}` and replaced `grafana.rbac.pspUseAppArmor` in favor of `grafana.rbac.pspAnnotations={}` in order to make it possible to deploy this chart on a hardened cluster which does not support Seccomp or AppArmor annotations in PSPs. Users can always choose to specify the annotations they want to use for the PSP directly as part of the values provided. -- Modified `.Values.prometheus.prometheusSpec.containers` to take in a string representing a template that should be rendered by Helm (via `tpl`) instead of allowing a user to provide YAML directly. -- Modified the default Grafana configuration to auto assign users who access Grafana to the Viewer role and enable anonymous access to Grafana dashboards by default. This default works well for a Rancher user who is accessing Grafana via the `kubectl proxy` on the Rancher Dashboard UI since anonymous users who enter via the proxy are authenticated by the k8s API Server, but you can / should modify this behavior if you plan on exposing Grafana in a way that does not require authentication (e.g. as a `NodePort` service). -- Modified the default Grafana configuration to add a default dashboard for Rancher on the Grafana home page. \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/CONTRIBUTING.md b/charts/rancher-monitoring/103.1.2+up45.31.1/CONTRIBUTING.md deleted file mode 100644 index f6ce2a3235..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/CONTRIBUTING.md +++ /dev/null @@ -1,12 +0,0 @@ -# Contributing Guidelines - -## How to contribute to this chart - -1. Fork this repository, develop and test your Chart. -1. Bump the chart version for every change. -1. Ensure PR title has the prefix `[kube-prometheus-stack]` -1. When making changes to rules or dashboards, see the README.md section on how to sync data from upstream repositories -1. Check the `hack/minikube` folder has scripts to set up minikube and components of this chart that will allow all components to be scraped. You can use this configuration when validating your changes. -1. Check for changes of RBAC rules. -1. Check for changes in CRD specs. -1. PR must pass the linter (`helm lint`) diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/Chart.yaml deleted file mode 100644 index ce778e2f03..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/Chart.yaml +++ /dev/null @@ -1,124 +0,0 @@ -annotations: - artifacthub.io/license: Apache-2.0 - artifacthub.io/links: | - - name: Chart Source - url: https://github.com/prometheus-community/helm-charts - - name: Upstream Project - url: https://github.com/prometheus-operator/kube-prometheus - artifacthub.io/operator: "true" - catalog.cattle.io/auto-install: rancher-monitoring-crd=match - catalog.cattle.io/certified: rancher - catalog.cattle.io/deploys-on-os: windows - catalog.cattle.io/display-name: Monitoring - catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.29.0-0' - catalog.cattle.io/namespace: cattle-monitoring-system - catalog.cattle.io/permits-os: linux,windows - catalog.cattle.io/provides-gvr: monitoring.coreos.com.prometheus/v1 - catalog.cattle.io/rancher-version: '>= 2.8.0-0 < 2.9.0-0' - catalog.cattle.io/release-name: rancher-monitoring - catalog.cattle.io/requests-cpu: 4500m - catalog.cattle.io/requests-memory: 4000Mi - catalog.cattle.io/type: cluster-tool - catalog.cattle.io/ui-component: monitoring - catalog.cattle.io/upstream-version: 45.31.1 -apiVersion: v2 -appVersion: v0.65.1 -dependencies: -- condition: grafana.enabled - name: grafana - repository: file://./charts/grafana -- condition: hardenedKubelet.enabled - name: hardenedKubelet - repository: file://./charts/hardenedKubelet -- condition: hardenedNodeExporter.enabled - name: hardenedNodeExporter - repository: file://./charts/hardenedNodeExporter -- condition: k3sServer.enabled - name: k3sServer - repository: file://./charts/k3sServer -- condition: kubeStateMetrics.enabled - name: kube-state-metrics - repository: file://./charts/kube-state-metrics -- condition: kubeAdmControllerManager.enabled - name: kubeAdmControllerManager - repository: file://./charts/kubeAdmControllerManager -- condition: kubeAdmEtcd.enabled - name: kubeAdmEtcd - repository: file://./charts/kubeAdmEtcd -- condition: kubeAdmProxy.enabled - name: kubeAdmProxy - repository: file://./charts/kubeAdmProxy -- condition: kubeAdmScheduler.enabled - name: kubeAdmScheduler - repository: file://./charts/kubeAdmScheduler -- condition: prometheus-adapter.enabled - name: prometheus-adapter - repository: file://./charts/prometheus-adapter -- condition: nodeExporter.enabled - name: prometheus-node-exporter - repository: file://./charts/prometheus-node-exporter -- condition: rke2ControllerManager.enabled - name: rke2ControllerManager - repository: file://./charts/rke2ControllerManager -- condition: rke2Etcd.enabled - name: rke2Etcd - repository: file://./charts/rke2Etcd -- condition: rke2IngressNginx.enabled - name: rke2IngressNginx - repository: file://./charts/rke2IngressNginx -- condition: rke2Proxy.enabled - name: rke2Proxy - repository: file://./charts/rke2Proxy -- condition: rke2Scheduler.enabled - name: rke2Scheduler - repository: file://./charts/rke2Scheduler -- condition: rkeControllerManager.enabled - name: rkeControllerManager - repository: file://./charts/rkeControllerManager -- condition: rkeEtcd.enabled - name: rkeEtcd - repository: file://./charts/rkeEtcd -- condition: rkeIngressNginx.enabled - name: rkeIngressNginx - repository: file://./charts/rkeIngressNginx -- condition: rkeProxy.enabled - name: rkeProxy - repository: file://./charts/rkeProxy -- condition: rkeScheduler.enabled - name: rkeScheduler - repository: file://./charts/rkeScheduler -- condition: global.cattle.windows.enabled - name: windowsExporter - repository: file://./charts/windowsExporter -description: kube-prometheus-stack collects Kubernetes manifests, Grafana dashboards, - and Prometheus rules combined with documentation and scripts to provide easy to - operate end-to-end Kubernetes cluster monitoring with Prometheus using the Prometheus - Operator. -home: https://github.com/prometheus-operator/kube-prometheus -icon: https://raw.githubusercontent.com/prometheus/prometheus.github.io/master/assets/prometheus_logo-cb55bb5c346.png -keywords: -- operator -- prometheus -- kube-prometheus -kubeVersion: '>=1.16.0-0' -maintainers: -- email: andrew@quadcorps.co.uk - name: andrewgkew -- email: gianrubio@gmail.com - name: gianrubio -- email: github.gkarthiks@gmail.com - name: gkarthiks -- email: kube-prometheus-stack@sisti.pt - name: GMartinez-Sisti -- email: scott@r6by.com - name: scottrigby -- email: miroslav.hadzhiev@gmail.com - name: Xtigyro -- email: quentin.bisson@gmail.com - name: QuentinBisson -name: rancher-monitoring -sources: -- https://github.com/prometheus-community/helm-charts -- https://github.com/prometheus-operator/kube-prometheus -type: application -version: 103.1.2+up45.31.1 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/README.md deleted file mode 100644 index ca644c4119..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/README.md +++ /dev/null @@ -1,838 +0,0 @@ -# kube-prometheus-stack - -Installs the [kube-prometheus stack](https://github.com/prometheus-operator/kube-prometheus), a collection of Kubernetes manifests, [Grafana](http://grafana.com/) dashboards, and [Prometheus rules](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/) combined with documentation and scripts to provide easy to operate end-to-end Kubernetes cluster monitoring with [Prometheus](https://prometheus.io/) using the [Prometheus Operator](https://github.com/prometheus-operator/prometheus-operator). - -See the [kube-prometheus](https://github.com/prometheus-operator/kube-prometheus) README for details about components, dashboards, and alerts. - -_Note: This chart was formerly named `prometheus-operator` chart, now renamed to more clearly reflect that it installs the `kube-prometheus` project stack, within which Prometheus Operator is only one component._ - -## Prerequisites - -- Kubernetes 1.16+ -- Helm 3+ - -## Get Helm Repository Info - -```console -helm repo add prometheus-community https://prometheus-community.github.io/helm-charts -helm repo update -``` - -_See [`helm repo`](https://helm.sh/docs/helm/helm_repo/) for command documentation._ - -## Install Helm Chart - -```console -helm install [RELEASE_NAME] prometheus-community/kube-prometheus-stack -``` - -_See [configuration](#configuration) below._ - -_See [helm install](https://helm.sh/docs/helm/helm_install/) for command documentation._ - -## Dependencies - -By default this chart installs additional, dependent charts: - -- [prometheus-community/kube-state-metrics](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-state-metrics) -- [prometheus-community/prometheus-node-exporter](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-node-exporter) -- [grafana/grafana](https://github.com/grafana/helm-charts/tree/main/charts/grafana) - -To disable dependencies during installation, see [multiple releases](#multiple-releases) below. - -_See [helm dependency](https://helm.sh/docs/helm/helm_dependency/) for command documentation._ - -## Uninstall Helm Chart - -```console -helm uninstall [RELEASE_NAME] -``` - -This removes all the Kubernetes components associated with the chart and deletes the release. - -_See [helm uninstall](https://helm.sh/docs/helm/helm_uninstall/) for command documentation._ - -CRDs created by this chart are not removed by default and should be manually cleaned up: - -```console -kubectl delete crd alertmanagerconfigs.monitoring.coreos.com -kubectl delete crd alertmanagers.monitoring.coreos.com -kubectl delete crd podmonitors.monitoring.coreos.com -kubectl delete crd probes.monitoring.coreos.com -kubectl delete crd prometheuses.monitoring.coreos.com -kubectl delete crd prometheusrules.monitoring.coreos.com -kubectl delete crd servicemonitors.monitoring.coreos.com -kubectl delete crd thanosrulers.monitoring.coreos.com -``` - -## Upgrading Chart - -```console -helm upgrade [RELEASE_NAME] prometheus-community/kube-prometheus-stack -``` - -With Helm v3, CRDs created by this chart are not updated by default and should be manually updated. -Consult also the [Helm Documentation on CRDs](https://helm.sh/docs/chart_best_practices/custom_resource_definitions). - -_See [helm upgrade](https://helm.sh/docs/helm/helm_upgrade/) for command documentation._ - -### Upgrading an existing Release to a new major version - -A major chart version change (like v1.2.3 -> v2.0.0) indicates that there is an incompatible breaking change needing manual actions. - -### From 44.x to 45.x - -This version upgrades Prometheus-Operator to v0.63.0, Prometheus to v2.43.0 and Thanos to v0.30.2. - -Run these commands to update the CRDs before applying the upgrade. - -```console -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.63.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.63.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.63.0/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.63.0/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.63.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.63.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.63.0/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.63.0/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml -``` - -### From 43.x to 44.x - -This version upgrades Prometheus-Operator to v0.62.0, Prometheus to v2.41.0 and Thanos to v0.30.1. - -Run these commands to update the CRDs before applying the upgrade. - -```console -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.62.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.62.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.62.0/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.62.0/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.62.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.62.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.62.0/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.62.0/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml -``` - -If you have explicitly set `prometheusOperator.admissionWebhooks.failurePolicy`, this value is now always used even when `.prometheusOperator.admissionWebhooks.patch.enabled` is `true` (the default). - -The values for `prometheusOperator.image.tag` & `prometheusOperator.prometheusConfigReloader.image.tag` are now empty by default and the Chart.yaml `appVersion` field is used instead. - -### From 42.x to 43.x - -This version upgrades Prometheus-Operator to v0.61.1, Prometheus to v2.40.5 and Thanos to v0.29.0. - -Run these commands to update the CRDs before applying the upgrade. - -```console -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.61.1/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.61.1/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.61.1/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.61.1/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.61.1/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.61.1/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.61.1/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.61.1/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml -``` - -### From 41.x to 42.x - -This includes the overridability of container registry for all containers at the global level using `global.imageRegistry` or per container image. The defaults have not changed but if you were using a custom image, you will have to override the registry of said custom container image before you upgrade. - -For instance, the prometheus-config-reloader used to be configured as follow: - -```yaml - image: - repository: quay.io/prometheus-operator/prometheus-config-reloader - tag: v0.60.1 - sha: "" -``` - -But it now moved to: - -```yaml - image: - registry: quay.io - repository: prometheus-operator/prometheus-config-reloader - tag: v0.60.1 - sha: "" -``` - -### From 40.x to 41.x - -This version upgrades Prometheus-Operator to v0.60.1, Prometheus to v2.39.1 and Thanos to v0.28.1. -This version also upgrades the Helm charts of kube-state-metrics to 4.20.2, prometheus-node-exporter to 4.3.0 and Grafana to 6.40.4. - -Run these commands to update the CRDs before applying the upgrade. - -```console -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.60.1/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.60.1/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.60.1/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.60.1/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.60.1/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.60.1/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.60.1/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.60.1/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml -``` - -This version splits kubeScheduler recording and altering rules in separate config values. -Instead of `defaultRules.rules.kubeScheduler` the 2 new variables `defaultRules.rules.kubeSchedulerAlerting` and `defaultRules.rules.kubeSchedulerRecording` are used. - -### From 39.x to 40.x - -This version upgrades Prometheus-Operator to v0.59.1, Prometheus to v2.38.0, kube-state-metrics to v2.6.0 and Thanos to v0.28.0. -This version also upgrades the Helm charts of kube-state-metrics to 4.18.0 and prometheus-node-exporter to 4.2.0. - -Run these commands to update the CRDs before applying the upgrade. - -```console -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.59.1/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.59.1/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.59.1/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.59.1/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.59.1/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.59.1/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.59.1/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.59.1/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml -``` - -Starting from prometheus-node-exporter version 4.0.0, the `node exporter` chart is using the [Kubernetes recommended labels](https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/). Therefore you have to delete the daemonset before you upgrade. - -```console -kubectl delete daemonset -l app=prometheus-node-exporter -helm upgrade -i kube-prometheus-stack prometheus-community/kube-prometheus-stack -``` - -If you use your own custom [ServiceMonitor](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#servicemonitor) or [PodMonitor](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#podmonitor), please ensure to upgrade their `selector` fields accordingly to the new labels. - -### From 38.x to 39.x - -This upgraded prometheus-operator to v0.58.0 and prometheus to v2.37.0 - -Run these commands to update the CRDs before applying the upgrade. - -```console -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.58.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.58.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.58.0/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.58.0/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.58.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.58.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.58.0/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.58.0/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml -``` - -### From 37.x to 38.x - -Reverted one of the default metrics relabelings for cAdvisor added in 36.x, due to it breaking container_network_* and various other statistics. If you do not want this change, you will need to override the `kubelet.cAdvisorMetricRelabelings`. - -### From 36.x to 37.x - -This includes some default metric relabelings for cAdvisor and apiserver metrics to reduce cardinality. If you do not want these defaults, you will need to override the `kubeApiServer.metricRelabelings` and or `kubelet.cAdvisorMetricRelabelings`. - -### From 35.x to 36.x - -This upgraded prometheus-operator to v0.57.0 and prometheus to v2.36.1 - -Run these commands to update the CRDs before applying the upgrade. - -```console -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.57.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.57.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.57.0/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.57.0/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.57.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.57.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.57.0/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.57.0/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml -``` - -### From 34.x to 35.x - -This upgraded prometheus-operator to v0.56.0 and prometheus to v2.35.0 - -Run these commands to update the CRDs before applying the upgrade. - -```console -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.56.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.56.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.56.0/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.56.0/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.56.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.56.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.56.0/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.56.0/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml -``` - -### From 33.x to 34.x - -This upgrades to prometheus-operator to v0.55.0 and prometheus to v2.33.5. - -Run these commands to update the CRDs before applying the upgrade. - -```console -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.55.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.55.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.55.0/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.55.0/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.55.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.55.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.55.0/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.55.0/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml -``` - -### From 32.x to 33.x - -This upgrades the prometheus-node-exporter Chart to v3.0.0. Please review the changes to this subchart if you make customizations to hostMountPropagation. - -### From 31.x to 32.x - -This upgrades to prometheus-operator to v0.54.0 and prometheus to v2.33.1. It also changes the default for `grafana.serviceMonitor.enabled` to `true. - -Run these commands to update the CRDs before applying the upgrade. - -```console -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.54.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.54.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.54.0/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.54.0/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.54.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.54.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.54.0/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.54.0/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml -``` - -### From 30.x to 31.x - -This version removes the built-in grafana ServiceMonitor and instead relies on the ServiceMonitor of the sub-chart. -`grafana.serviceMonitor.enabled` must be set instead of `grafana.serviceMonitor.selfMonitor` and the old ServiceMonitor may -need to be manually cleaned up after deploying the new release. - -### From 29.x to 30.x - -This version updates kube-state-metrics to 4.3.0 and uses the new option `kube-state-metrics.releaseLabel=true` which adds the "release" label to kube-state-metrics labels, making scraping of the metrics by kube-prometheus-stack work out of the box again, independent of the used kube-prometheus-stack release name. If you already set the "release" label via `kube-state-metrics.customLabels` you might have to remove that and use it via the new option. - -### From 28.x to 29.x - -This version makes scraping port for kube-controller-manager and kube-scheduler dynamic to reflect changes to default serving ports -for those components in Kubernetes versions v1.22 and v1.23 respectively. - -If you deploy on clusters using version v1.22+, kube-controller-manager will be scraped over HTTPS on port 10257. - -If you deploy on clusters running version v1.23+, kube-scheduler will be scraped over HTTPS on port 10259. - -### From 27.x to 28.x - -This version disables PodSecurityPolicies by default because they are deprecated in Kubernetes 1.21 and will be removed in Kubernetes 1.25. - -If you are using PodSecurityPolicies you can enable the previous behaviour by setting `kube-state-metrics.podSecurityPolicy.enabled`, `prometheus-node-exporter.rbac.pspEnabled`, `grafana.rbac.pspEnabled` and `global.rbac.pspEnabled` to `true`. - -### From 26.x to 27.x - -This version splits prometheus-node-exporter chart recording and altering rules in separate config values. -Instead of `defaultRules.rules.node` the 2 new variables `defaultRules.rules.nodeExporterAlerting` and `defaultRules.rules.nodeExporterRecording` are used. - -Also the following defaultRules.rules has been removed as they had no effect: `kubeApiserverError`, `kubePrometheusNodeAlerting`, `kubernetesAbsent`, `time`. - -The ability to set a rubookUrl via `defaultRules.rules.rubookUrl` was reintroduced. - -### From 25.x to 26.x - -This version enables the prometheus-node-exporter subchart servicemonitor by default again, by setting `prometheus-node-exporter.prometheus.monitor.enabled` to `true`. - -### From 24.x to 25.x - -This version upgrade to prometheus-operator v0.53.1. It removes support for setting a runbookUrl, since the upstream format for runbooks changed. - -```console -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.53.1/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.53.1/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.53.1/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.53.1/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.53.1/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.53.1/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.53.1/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml -kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.53.1/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml -``` - -### From 23.x to 24.x - -The custom `ServiceMonitor` for the _kube-state-metrics_ & _prometheus-node-exporter_ charts have been removed in favour of the built-in sub-chart `ServiceMonitor`; for both sub-charts this means that `ServiceMonitor` customisations happen via the values passed to the chart. If you haven't directly customised this behaviour then there are no changes required to upgrade, but if you have please read the following. - -For _kube-state-metrics_ the `ServiceMonitor` customisation is now set via `kube-state-metrics.prometheus.monitor` and the `kubeStateMetrics.serviceMonitor.selfMonitor.enabled` value has moved to `kube-state-metrics.selfMonitor.enabled`. - -For _prometheus-node-exporter_ the `ServiceMonitor` customisation is now set via `prometheus-node-exporter.prometheus.monitor` and the `nodeExporter.jobLabel` values has moved to `prometheus-node-exporter.prometheus.monitor.jobLabel`. - -### From 22.x to 23.x - -Port names have been renamed for Istio's -[explicit protocol selection](https://istio.io/latest/docs/ops/configuration/traffic-management/protocol-selection/#explicit-protocol-selection). - -| | old value | new value | -|-|-----------|-----------| -| `alertmanager.alertmanagerSpec.portName` | `web` | `http-web` | -| `grafana.service.portName` | `service` | `http-web` | -| `prometheus-node-exporter.service.portName` | `metrics` (hardcoded) | `http-metrics` | -| `prometheus.prometheusSpec.portName` | `web` | `http-web` | - -### From 21.x to 22.x - -Due to the upgrade of the `kube-state-metrics` chart, removal of its deployment/stateful needs to done manually prior to upgrading: - -```console -kubectl delete deployments.apps -l app.kubernetes.io/instance=prometheus-operator,app.kubernetes.io/name=kube-state-metrics --cascade=orphan -``` - -or if you use autosharding: - -```console -kubectl delete statefulsets.apps -l app.kubernetes.io/instance=prometheus-operator,app.kubernetes.io/name=kube-state-metrics --cascade=orphan -``` - -### From 20.x to 21.x - -The config reloader values have been refactored. All the values have been moved to the key `prometheusConfigReloader` and the limits and requests can now be set separately. - -### From 19.x to 20.x - -Version 20 upgrades prometheus-operator from 0.50.x to 0.52.x. Helm does not automatically upgrade or install new CRDs on a chart upgrade, so you have to install the CRDs manually before updating: - -```console -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.52.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.52.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.52.0/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.52.0/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.52.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.52.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.52.0/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.52.0/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml -``` - -### From 18.x to 19.x - -`kubeStateMetrics.serviceMonitor.namespaceOverride` was removed. -Please use `kube-state-metrics.namespaceOverride` instead. - -### From 17.x to 18.x - -Version 18 upgrades prometheus-operator from 0.49.x to 0.50.x. Helm does not automatically upgrade or install new CRDs on a chart upgrade, so you have to install the CRDs manually before updating: - -```console -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.50.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.50.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.50.0/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.50.0/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.50.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.50.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.50.0/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.50.0/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml -``` - -### From 16.x to 17.x - -Version 17 upgrades prometheus-operator from 0.48.x to 0.49.x. Helm does not automatically upgrade or install new CRDs on a chart upgrade, so you have to install the CRDs manually before updating: - -```console -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.49.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.49.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.49.0/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.49.0/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.49.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.49.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.49.0/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.49.0/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml -``` - -### From 15.x to 16.x - -Version 16 upgrades kube-state-metrics to v2.0.0. This includes changed command-line arguments and removed metrics, see this [blog post](https://kubernetes.io/blog/2021/04/13/kube-state-metrics-v-2-0/). This version also removes Grafana dashboards that supported Kubernetes 1.14 or earlier. - -### From 14.x to 15.x - -Version 15 upgrades prometheus-operator from 0.46.x to 0.47.x. Helm does not automatically upgrade or install new CRDs on a chart upgrade, so you have to install the CRDs manually before updating: - -```console -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.47.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.47.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.47.0/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.47.0/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.47.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.47.0/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.47.0/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml -``` - -### From 13.x to 14.x - -Version 14 upgrades prometheus-operator from 0.45.x to 0.46.x. Helm does not automatically upgrade or install new CRDs on a chart upgrade, so you have to install the CRDs manually before updating: - -```console -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.46.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.46.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.46.0/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.46.0/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.46.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.46.0/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.46.0/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml -``` - -### From 12.x to 13.x - -Version 13 upgrades prometheus-operator from 0.44.x to 0.45.x. Helm does not automatically upgrade or install new CRDs on a chart upgrade, so you have to install the CRD manually before updating: - -```console -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.45.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.45.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.45.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml -``` - -### From 11.x to 12.x - -Version 12 upgrades prometheus-operator from 0.43.x to 0.44.x. Helm does not automatically upgrade or install new CRDs on a chart upgrade, so you have to install the CRD manually before updating: - -```console -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/release-0.44/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -``` - -The chart was migrated to support only helm v3 and later. - -### From 10.x to 11.x - -Version 11 upgrades prometheus-operator from 0.42.x to 0.43.x. Starting with 0.43.x an additional `AlertmanagerConfigs` CRD is introduced. Helm does not automatically upgrade or install new CRDs on a chart upgrade, so you have to install the CRD manually before updating: - -```console -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/release-0.43/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml -``` - -Version 11 removes the deprecated tlsProxy via ghostunnel in favor of native TLS support the prometheus-operator gained with v0.39.0. - -### From 9.x to 10.x - -Version 10 upgrades prometheus-operator from 0.38.x to 0.42.x. Starting with 0.40.x an additional `Probes` CRD is introduced. Helm does not automatically upgrade or install new CRDs on a chart upgrade, so you have to install the CRD manually before updating: - -```console -kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/release-0.42/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml -``` - -### From 8.x to 9.x - -Version 9 of the helm chart removes the existing `additionalScrapeConfigsExternal` in favour of `additionalScrapeConfigsSecret`. This change lets users specify the secret name and secret key to use for the additional scrape configuration of prometheus. This is useful for users that have prometheus-operator as a subchart and also have a template that creates the additional scrape configuration. - -### From 7.x to 8.x - -Due to new template functions being used in the rules in version 8.x.x of the chart, an upgrade to Prometheus Operator and Prometheus is necessary in order to support them. First, upgrade to the latest version of 7.x.x - -```console -helm upgrade [RELEASE_NAME] prometheus-community/kube-prometheus-stack --version 7.5.0 -``` - -Then upgrade to 8.x.x - -```console -helm upgrade [RELEASE_NAME] prometheus-community/kube-prometheus-stack --version [8.x.x] -``` - -Minimal recommended Prometheus version for this chart release is `2.12.x` - -### From 6.x to 7.x - -Due to a change in grafana subchart, version 7.x.x now requires Helm >= 2.12.0. - -### From 5.x to 6.x - -Due to a change in deployment labels of kube-state-metrics, the upgrade requires `helm upgrade --force` in order to re-create the deployment. If this is not done an error will occur indicating that the deployment cannot be modified: - -```console -invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app.kubernetes.io/name":"kube-state-metrics"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable -``` - -If this error has already been encountered, a `helm history` command can be used to determine which release has worked, then `helm rollback` to the release, then `helm upgrade --force` to this new one - -## Configuration - -See [Customizing the Chart Before Installing](https://helm.sh/docs/intro/using_helm/#customizing-the-chart-before-installing). To see all configurable options with detailed comments: - -```console -helm show values prometheus-community/kube-prometheus-stack -``` - -You may also run `helm show values` on this chart's [dependencies](#dependencies) for additional options. - -### Rancher Monitoring Configuration - -The following table shows values exposed by Rancher Monitoring's additions to the chart: - -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `nameOverride` | Provide a name that should be used instead of the chart name when naming all resources deployed by this chart |`"rancher-monitoring"`| -| `namespaceOverride` | Override the deployment namespace | `"cattle-monitoring-system"` | -| `global.rbac.userRoles.create` | Create default user ClusterRoles to allow users to interact with Prometheus CRs, ConfigMaps, and Secrets | `true` | -| `global.rbac.userRoles.aggregateToDefaultRoles` | Aggregate default user ClusterRoles into default k8s ClusterRoles | `true` | -| `prometheus-adapter.enabled` | Whether to install [prometheus-adapter](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-adapter) within the cluster | `true` | -| `prometheus-adapter.prometheus.url` | A URL pointing to the Prometheus deployment within your cluster. The default value is set based on the assumption that you plan to deploy the default Prometheus instance from this chart where `.Values.namespaceOverride=cattle-monitoring-system` and `.Values.nameOverride=rancher-monitoring` | `http://rancher-monitoring-prometheus.cattle-monitoring-system.svc` | -| `prometheus-adapter.prometheus.port` | The port on the Prometheus deployment that Prometheus Adapter can make requests to | `9090` | -| `prometheus.prometheusSpec.ignoreNamespaceSelectors` | Ignore NamespaceSelector settings from the PodMonitor and ServiceMonitor configs. If true, PodMonitors and ServiceMonitors can only discover Pods and Services within the namespace they are deployed into | `false` | - -The following values are enabled for different distributions via [rancher-pushprox](https://github.com/rancher/dev-charts/tree/master/packages/rancher-pushprox). See the rancher-pushprox `README.md` for more information on what all values can be configured for the PushProxy chart. - -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `rkeControllerManager.enabled` | Create a PushProx installation for monitoring kube-controller-manager metrics in RKE clusters | `false` | -| `rkeScheduler.enabled` | Create a PushProx installation for monitoring kube-scheduler metrics in RKE clusters | `false` | -| `rkeProxy.enabled` | Create a PushProx installation for monitoring kube-proxy metrics in RKE clusters | `false` | -| `rkeIngressNginx.enabled` | Create a PushProx installation for monitoring ingress-nginx metrics in RKE clusters | `false` | -| `rkeEtcd.enabled` | Create a PushProx installation for monitoring etcd metrics in RKE clusters | `false` | -| `rke2IngressNginx.enabled` | Create a PushProx installation for monitoring ingress-nginx metrics in RKE2 clusters | `false` | -| `k3sServer.enabled` | Create a PushProx installation for monitoring k3s-server metrics (accounts for kube-controller-manager, kube-scheduler, and kube-proxy metrics) in k3s clusters | `false` | -| `kubeAdmControllerManager.enabled` | Create a PushProx installation for monitoring kube-controller-manager metrics in kubeAdm clusters | `false` | -| `kubeAdmScheduler.enabled` | Create a PushProx installation for monitoring kube-scheduler metrics in kubeAdm clusters | `false` | -| `kubeAdmProxy.enabled` | Create a PushProx installation for monitoring kube-proxy metrics in kubeAdm clusters | `false` | -| `kubeAdmEtcd.enabled` | Create a PushProx installation for monitoring etcd metrics in kubeAdm clusters | `false` | - - -### Multiple releases - -The same chart can be used to run multiple Prometheus instances in the same cluster if required. To achieve this, it is necessary to run only one instance of prometheus-operator and a pair of alertmanager pods for an HA configuration, while all other components need to be disabled. To disable a dependency during installation, set `kubeStateMetrics.enabled`, `nodeExporter.enabled` and `grafana.enabled` to `false`. - -## Work-Arounds for Known Issues - -### Running on private GKE clusters - -When Google configure the control plane for private clusters, they automatically configure VPC peering between your Kubernetes cluster’s network and a separate Google managed project. In order to restrict what Google are able to access within your cluster, the firewall rules configured restrict access to your Kubernetes pods. This means that in order to use the webhook component with a GKE private cluster, you must configure an additional firewall rule to allow the GKE control plane access to your webhook pod. - -You can read more information on how to add firewall rules for the GKE control plane nodes in the [GKE docs](https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters#add_firewall_rules) - -Alternatively, you can disable the hooks by setting `prometheusOperator.admissionWebhooks.enabled=false`. - -## PrometheusRules Admission Webhooks - -With Prometheus Operator version 0.30+, the core Prometheus Operator pod exposes an endpoint that will integrate with the `validatingwebhookconfiguration` Kubernetes feature to prevent malformed rules from being added to the cluster. - -### How the Chart Configures the Hooks - -A validating and mutating webhook configuration requires the endpoint to which the request is sent to use TLS. It is possible to set up custom certificates to do this, but in most cases, a self-signed certificate is enough. The setup of this component requires some more complex orchestration when using helm. The steps are created to be idempotent and to allow turning the feature on and off without running into helm quirks. - -1. A pre-install hook provisions a certificate into the same namespace using a format compatible with provisioning using end user certificates. If the certificate already exists, the hook exits. -2. The prometheus operator pod is configured to use a TLS proxy container, which will load that certificate. -3. Validating and Mutating webhook configurations are created in the cluster, with their failure mode set to Ignore. This allows rules to be created by the same chart at the same time, even though the webhook has not yet been fully set up - it does not have the correct CA field set. -4. A post-install hook reads the CA from the secret created by step 1 and patches the Validating and Mutating webhook configurations. This process will allow a custom CA provisioned by some other process to also be patched into the webhook configurations. The chosen failure policy is also patched into the webhook configurations - -### Alternatives - -It should be possible to use [jetstack/cert-manager](https://github.com/jetstack/cert-manager) if a more complete solution is required, but it has not been tested. - -You can enable automatic self-signed TLS certificate provisioning via cert-manager by setting the `prometheusOperator.admissionWebhooks.certManager.enabled` value to true. - -### Limitations - -Because the operator can only run as a single pod, there is potential for this component failure to cause rule deployment failure. Because this risk is outweighed by the benefit of having validation, the feature is enabled by default. - -## Developing Prometheus Rules and Grafana Dashboards - -This chart Grafana Dashboards and Prometheus Rules are just a copy from [prometheus-operator/prometheus-operator](https://github.com/prometheus-operator/prometheus-operator) and other sources, synced (with alterations) by scripts in [hack](hack) folder. In order to introduce any changes you need to first [add them to the original repository](https://github.com/prometheus-operator/kube-prometheus/blob/main/docs/customizations/developing-prometheus-rules-and-grafana-dashboards.md) and then sync there by scripts. - -## Further Information - -For more in-depth documentation of configuration options meanings, please see - -- [Prometheus Operator](https://github.com/prometheus-operator/prometheus-operator) -- [Prometheus](https://prometheus.io/docs/introduction/overview/) -- [Grafana](https://github.com/grafana/helm-charts/tree/main/charts/grafana#grafana-helm-chart) - -## prometheus.io/scrape - -The prometheus operator does not support annotation-based discovery of services, using the `PodMonitor` or `ServiceMonitor` CRD in its place as they provide far more configuration options. -For information on how to use PodMonitors/ServiceMonitors, please see the documentation on the `prometheus-operator/prometheus-operator` documentation here: - -- [ServiceMonitors](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/getting-started.md#include-servicemonitors) -- [PodMonitors](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/getting-started.md#include-podmonitors) -- [Running Exporters](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/running-exporters.md) - -By default, Prometheus discovers PodMonitors and ServiceMonitors within its namespace, that are labeled with the same release tag as the prometheus-operator release. -Sometimes, you may need to discover custom PodMonitors/ServiceMonitors, for example used to scrape data from third-party applications. -An easy way of doing this, without compromising the default PodMonitors/ServiceMonitors discovery, is allowing Prometheus to discover all PodMonitors/ServiceMonitors within its namespace, without applying label filtering. -To do so, you can set `prometheus.prometheusSpec.podMonitorSelectorNilUsesHelmValues` and `prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues` to `false`. - -## Migrating from stable/prometheus-operator chart - -## Zero downtime - -Since `kube-prometheus-stack` is fully compatible with the `stable/prometheus-operator` chart, a migration without downtime can be achieved. -However, the old name prefix needs to be kept. If you want the new name please follow the step by step guide below (with downtime). - -You can override the name to achieve this: - -```console -helm upgrade prometheus-operator prometheus-community/kube-prometheus-stack -n monitoring --reuse-values --set nameOverride=prometheus-operator -``` - -**Note**: It is recommended to run this first with `--dry-run --debug`. - -## Redeploy with new name (downtime) - -If the **prometheus-operator** values are compatible with the new **kube-prometheus-stack** chart, please follow the below steps for migration: - -> The guide presumes that chart is deployed in `monitoring` namespace and the deployments are running there. If in other namespace, please replace the `monitoring` to the deployed namespace. - -1. Patch the PersistenceVolume created/used by the prometheus-operator chart to `Retain` claim policy: - - ```console - kubectl patch pv/ -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}' - ``` - - **Note:** To execute the above command, the user must have a cluster wide permission. Please refer [Kubernetes RBAC](https://kubernetes.io/docs/reference/access-authn-authz/rbac/) - -2. Uninstall the **prometheus-operator** release and delete the existing PersistentVolumeClaim, and verify PV become Released. - - ```console - helm uninstall prometheus-operator -n monitoring - kubectl delete pvc/ -n monitoring - ``` - - Additionally, you have to manually remove the remaining `prometheus-operator-kubelet` service. - - ```console - kubectl delete service/prometheus-operator-kubelet -n kube-system - ``` - - You can choose to remove all your existing CRDs (ServiceMonitors, Podmonitors, etc.) if you want to. - -3. Remove current `spec.claimRef` values to change the PV's status from Released to Available. - - ```console - kubectl patch pv/ --type json -p='[{"op": "remove", "path": "/spec/claimRef"}]' -n monitoring - ``` - -**Note:** To execute the above command, the user must have a cluster wide permission. Please refer to [Kubernetes RBAC](https://kubernetes.io/docs/reference/access-authn-authz/rbac/) - -After these steps, proceed to a fresh **kube-prometheus-stack** installation and make sure the current release of **kube-prometheus-stack** matching the `volumeClaimTemplate` values in the `values.yaml`. - -The binding is done via matching a specific amount of storage requested and with certain access modes. - -For example, if you had storage specified as this with **prometheus-operator**: - -```yaml -volumeClaimTemplate: - spec: - storageClassName: gp2 - accessModes: ["ReadWriteOnce"] - resources: - requests: - storage: 50Gi -``` - -You have to specify matching `volumeClaimTemplate` with 50Gi storage and `ReadWriteOnce` access mode. - -Additionally, you should check the current AZ of your legacy installation's PV, and configure the fresh release to use the same AZ as the old one. If the pods are in a different AZ than the PV, the release will fail to bind the existing one, hence creating a new PV. - -This can be achieved either by specifying the labels through `values.yaml`, e.g. setting `prometheus.prometheusSpec.nodeSelector` to: - -```yaml -nodeSelector: - failure-domain.beta.kubernetes.io/zone: east-west-1a -``` - -or passing these values as `--set` overrides during installation. - -The new release should now re-attach your previously released PV with its content. - -## Migrating from coreos/prometheus-operator chart - -The multiple charts have been combined into a single chart that installs prometheus operator, prometheus, alertmanager, grafana as well as the multitude of exporters necessary to monitor a cluster. - -There is no simple and direct migration path between the charts as the changes are extensive and intended to make the chart easier to support. - -The capabilities of the old chart are all available in the new chart, including the ability to run multiple prometheus instances on a single cluster - you will need to disable the parts of the chart you do not wish to deploy. - -You can check out the tickets for this change [here](https://github.com/prometheus-operator/prometheus-operator/issues/592) and [here](https://github.com/helm/charts/pull/6765). - -### High-level overview of Changes - -#### Added dependencies - -The chart has added 3 [dependencies](#dependencies). - -- Node-Exporter, Kube-State-Metrics: These components are loaded as dependencies into the chart, and are relatively simple components -- Grafana: The Grafana chart is more feature-rich than this chart - it contains a sidecar that is able to load data sources and dashboards from configmaps deployed into the same cluster. For more information check out the [documentation for the chart](https://github.com/grafana/helm-charts/blob/main/charts/grafana/README.md) - -#### Kubelet Service - -Because the kubelet service has a new name in the chart, make sure to clean up the old kubelet service in the `kube-system` namespace to prevent counting container metrics twice. - -#### Persistent Volumes - -If you would like to keep the data of the current persistent volumes, it should be possible to attach existing volumes to new PVCs and PVs that are created using the conventions in the new chart. For example, in order to use an existing Azure disk for a helm release called `prometheus-migration` the following resources can be created: - -```yaml -apiVersion: v1 -kind: PersistentVolume -metadata: - name: pvc-prometheus-migration-prometheus-0 -spec: - accessModes: - - ReadWriteOnce - azureDisk: - cachingMode: None - diskName: pvc-prometheus-migration-prometheus-0 - diskURI: /subscriptions/f5125d82-2622-4c50-8d25-3f7ba3e9ac4b/resourceGroups/sample-migration-resource-group/providers/Microsoft.Compute/disks/pvc-prometheus-migration-prometheus-0 - fsType: "" - kind: Managed - readOnly: false - capacity: - storage: 1Gi - persistentVolumeReclaimPolicy: Delete - storageClassName: prometheus - volumeMode: Filesystem -``` - -```yaml -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - labels: - app.kubernetes.io/name: prometheus - prometheus: prometheus-migration-prometheus - name: prometheus-prometheus-migration-prometheus-db-prometheus-prometheus-migration-prometheus-0 - namespace: monitoring -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 1Gi - storageClassName: prometheus - volumeMode: Filesystem - volumeName: pvc-prometheus-migration-prometheus-0 -``` - -The PVC will take ownership of the PV and when you create a release using a persistent volume claim template it will use the existing PVCs as they match the naming convention used by the chart. For other cloud providers similar approaches can be used. - -#### KubeProxy - -The metrics bind address of kube-proxy is default to `127.0.0.1:10249` that prometheus instances **cannot** access to. You should expose metrics by changing `metricsBindAddress` field value to `0.0.0.0:10249` if you want to collect them. - -Depending on the cluster, the relevant part `config.conf` will be in ConfigMap `kube-system/kube-proxy` or `kube-system/kube-proxy-config`. For example: - -```console -kubectl -n kube-system edit cm kube-proxy -``` - -```yaml -apiVersion: v1 -data: - config.conf: |- - apiVersion: kubeproxy.config.k8s.io/v1alpha1 - kind: KubeProxyConfiguration - # ... - # metricsBindAddress: 127.0.0.1:10249 - metricsBindAddress: 0.0.0.0:10249 - # ... - kubeconfig.conf: |- - # ... -kind: ConfigMap -metadata: - labels: - app: kube-proxy - name: kube-proxy - namespace: kube-system -``` diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/app-README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/app-README.md deleted file mode 100644 index 3920854384..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/app-README.md +++ /dev/null @@ -1,46 +0,0 @@ -# Rancher Monitoring and Alerting - - This chart is based on the upstream [kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) chart. The chart deploys [Prometheus Operator](https://github.com/prometheus-operator/prometheus-operator) and its CRDs along with [Grafana](https://github.com/grafana/helm-charts/tree/main/charts/grafana), [Prometheus Adapter](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-adapter) and additional charts / Kubernetes manifests to gather metrics. It allows users to monitor their Kubernetes clusters, view metrics in Grafana dashboards, and set up alerts and notifications. - -For more information on how to use the feature, refer to our [docs](https://rancher.com/docs/rancher/v2.x/en/monitoring-alerting/v2.5/). - -The chart installs the following components: - -- [Prometheus Operator](https://github.com/coreos/prometheus-operator) - The operator provides easy monitoring definitions for Kubernetes services, manages [Prometheus](https://prometheus.io/) and [AlertManager](https://prometheus.io/docs/alerting/latest/alertmanager/) instances, and adds default scrape targets for some Kubernetes components. -- [kube-prometheus](https://github.com/prometheus-operator/kube-prometheus/) - A collection of community-curated Kubernetes manifests, Grafana Dashboards, and PrometheusRules that deploy a default end-to-end cluster monitoring configuration. -- [Grafana](https://github.com/grafana/helm-charts/tree/main/charts/grafana) - Grafana allows a user to create / view dashboards based on the cluster metrics collected by Prometheus. -- [node-exporter](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-node-exporter) / [kube-state-metrics](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-state-metrics) / [rancher-pushprox](https://github.com/rancher/charts/tree/dev-v2.7/packages/rancher-monitoring/rancher-pushprox/charts) - These charts monitor various Kubernetes components across different Kubernetes cluster types. -- [Prometheus Adapter](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-adapter) - The adapter allows a user to expose custom metrics, resource metrics, and external metrics on the default [Prometheus](https://prometheus.io/) instance to the Kubernetes API Server. - -For more information, review the Helm README of this chart. - -## Upgrading to Kubernetes v1.25+ - -Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. - -As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `global.cattle.psp.enabled` set to `false` if it has been previously set to `true`. -​ -> **Note:** -> In this chart release, any previous field that was associated with any PSP resources have been removed in favor of a single global field: `global.cattle.psp.enabled`. - -> **Note:** -> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** -> -> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. - -Upon setting `global.cattle.psp.enabled` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. -​ -As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. - -## Upgrading from 100.0.0+up16.6.0 to 100.1.0+up19.0.3 - -### Noticeable changes: -Grafana: -- `sidecar.dashboards.searchNamespace`, `sidecar.datasources.searchNamespace` and `sidecar.notifiers.searchNamespace` support a list of namespaces now. - -Kube-state-metrics -- the type of `collectors` is changed from Dictionary to List. -- `kubeStateMetrics.serviceMonitor.namespaceOverride` was replaced by `kube-state-metrics.namespaceOverride`. - -### Known issues: -- Occasionally, the upgrade fails with errors related to the webhook `prometheusrulemutate.monitoring.coreos.com`. This is a known issue in the upstream, and the workaround is to trigger the upgrade one more time. [32416](https://github.com/rancher/rancher/issues/32416#issuecomment-828881726) diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/.helmignore deleted file mode 100644 index 8cade1318f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.vscode -.project -.idea/ -*.tmproj -OWNERS diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/Chart.yaml deleted file mode 100644 index 417a80bf59..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/Chart.yaml +++ /dev/null @@ -1,39 +0,0 @@ -annotations: - artifacthub.io/license: AGPL-3.0-only - artifacthub.io/links: | - - name: Chart Source - url: https://github.com/grafana/helm-charts - - name: Upstream Project - url: https://github.com/grafana/grafana - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.16.0-0 < 1.27.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-grafana -apiVersion: v2 -appVersion: 10.1.0 -description: The leading tool for querying and visualizing time series and metrics. -home: https://grafana.net -icon: https://raw.githubusercontent.com/grafana/grafana/master/public/img/logo_transparent_400x.png -keywords: -- monitoring -- metric -kubeVersion: ^1.8.0-0 -maintainers: -- email: zanhsieh@gmail.com - name: zanhsieh -- email: rluckie@cisco.com - name: rtluckie -- email: maor.friedman@redhat.com - name: maorfr -- email: miroslav.hadzhiev@gmail.com - name: Xtigyro -- email: mail@torstenwalter.de - name: torstenwalter -name: grafana -sources: -- https://github.com/grafana/grafana -- https://github.com/grafana/helm-charts -type: application -version: 6.59.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/README.md deleted file mode 100644 index bb630b0073..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/README.md +++ /dev/null @@ -1,688 +0,0 @@ -# Grafana Helm Chart - -* Installs the web dashboarding system [Grafana](http://grafana.org/) - -## Get Repo Info - -```console -helm repo add grafana https://grafana.github.io/helm-charts -helm repo update -``` - -_See [helm repo](https://helm.sh/docs/helm/helm_repo/) for command documentation._ - -## Installing the Chart - -To install the chart with the release name `my-release`: - -```console -helm install my-release grafana/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. - -## Upgrading an existing Release to a new major version - -A major chart version change (like v1.2.3 -> v2.0.0) indicates that there is an -incompatible breaking change needing manual actions. - -### To 4.0.0 (And 3.12.1) - -This version requires Helm >= 2.12.0. - -### To 5.0.0 - -You have to add --force to your helm upgrade command as the labels of the chart have changed. - -### To 6.0.0 - -This version requires Helm >= 3.1.0. - -## Configuration - -| Parameter | Description | Default | -|-------------------------------------------|-----------------------------------------------|---------------------------------------------------------| -| `replicas` | Number of nodes | `1` | -| `podDisruptionBudget.minAvailable` | Pod disruption minimum available | `nil` | -| `podDisruptionBudget.maxUnavailable` | Pod disruption maximum unavailable | `nil` | -| `podDisruptionBudget.apiVersion` | Pod disruption apiVersion | `nil` | -| `deploymentStrategy` | Deployment strategy | `{ "type": "RollingUpdate" }` | -| `livenessProbe` | Liveness Probe settings | `{ "httpGet": { "path": "/api/health", "port": 3000 } "initialDelaySeconds": 60, "timeoutSeconds": 30, "failureThreshold": 10 }` | -| `readinessProbe` | Readiness Probe settings | `{ "httpGet": { "path": "/api/health", "port": 3000 } }`| -| `securityContext` | Deployment securityContext | `{"runAsUser": 472, "runAsGroup": 472, "fsGroup": 472}` | -| `priorityClassName` | Name of Priority Class to assign pods | `nil` | -| `image.repository` | Image repository | `grafana/grafana` | -| `image.tag` | Overrides the Grafana image tag whose default is the chart appVersion (`Must be >= 5.0.0`) | `` | -| `image.sha` | Image sha (optional) | `` | -| `image.pullPolicy` | Image pull policy | `IfNotPresent` | -| `image.pullSecrets` | Image pull secrets (can be templated) | `[]` | -| `service.enabled` | Enable grafana service | `true` | -| `service.type` | Kubernetes service type | `ClusterIP` | -| `service.port` | Kubernetes port where service is exposed | `80` | -| `service.portName` | Name of the port on the service | `service` | -| `service.appProtocol` | Adds the appProtocol field to the service | `` | -| `service.targetPort` | Internal service is port | `3000` | -| `service.nodePort` | Kubernetes service nodePort | `nil` | -| `service.annotations` | Service annotations (can be templated) | `{}` | -| `service.labels` | Custom labels | `{}` | -| `service.clusterIP` | internal cluster service IP | `nil` | -| `service.loadBalancerIP` | IP address to assign to load balancer (if supported) | `nil` | -| `service.loadBalancerSourceRanges` | list of IP CIDRs allowed access to lb (if supported) | `[]` | -| `service.externalIPs` | service external IP addresses | `[]` | -| `headlessService` | Create a headless service | `false` | -| `extraExposePorts` | Additional service ports for sidecar containers| `[]` | -| `hostAliases` | adds rules to the pod's /etc/hosts | `[]` | -| `ingress.enabled` | Enables Ingress | `false` | -| `ingress.annotations` | Ingress annotations (values are templated) | `{}` | -| `ingress.labels` | Custom labels | `{}` | -| `ingress.path` | Ingress accepted path | `/` | -| `ingress.pathType` | Ingress type of path | `Prefix` | -| `ingress.hosts` | Ingress accepted hostnames | `["chart-example.local"]` | -| `ingress.extraPaths` | Ingress extra paths to prepend to every host configuration. Useful when configuring [custom actions with AWS ALB Ingress Controller](https://kubernetes-sigs.github.io/aws-alb-ingress-controller/guide/ingress/annotation/#actions). Requires `ingress.hosts` to have one or more host entries. | `[]` | -| `ingress.tls` | Ingress TLS configuration | `[]` | -| `ingress.ingressClassName` | Ingress Class Name. MAY be required for Kubernetes versions >= 1.18 | `""` | -| `resources` | CPU/Memory resource requests/limits | `{}` | -| `nodeSelector` | Node labels for pod assignment | `{}` | -| `tolerations` | Toleration labels for pod assignment | `[]` | -| `affinity` | Affinity settings for pod assignment | `{}` | -| `extraInitContainers` | Init containers to add to the grafana pod | `{}` | -| `extraContainers` | Sidecar containers to add to the grafana pod | `""` | -| `extraContainerVolumes` | Volumes that can be mounted in sidecar containers | `[]` | -| `extraLabels` | Custom labels for all manifests | `{}` | -| `schedulerName` | Name of the k8s scheduler (other than default) | `nil` | -| `persistence.enabled` | Use persistent volume to store data | `false` | -| `persistence.type` | Type of persistence (`pvc` or `statefulset`) | `pvc` | -| `persistence.size` | Size of persistent volume claim | `10Gi` | -| `persistence.existingClaim` | Use an existing PVC to persist data (can be templated) | `nil` | -| `persistence.storageClassName` | Type of persistent volume claim | `nil` | -| `persistence.accessModes` | Persistence access modes | `[ReadWriteOnce]` | -| `persistence.annotations` | PersistentVolumeClaim annotations | `{}` | -| `persistence.finalizers` | PersistentVolumeClaim finalizers | `[ "kubernetes.io/pvc-protection" ]` | -| `persistence.extraPvcLabels` | Extra labels to apply to a PVC. | `{}` | -| `persistence.subPath` | Mount a sub dir of the persistent volume (can be templated) | `nil` | -| `persistence.inMemory.enabled` | If persistence is not enabled, whether to mount the local storage in-memory to improve performance | `false` | -| `persistence.inMemory.sizeLimit` | SizeLimit for the in-memory local storage | `nil` | -| `initChownData.enabled` | If false, don't reset data ownership at startup | true | -| `initChownData.image.repository` | init-chown-data container image repository | `busybox` | -| `initChownData.image.tag` | init-chown-data container image tag | `1.31.1` | -| `initChownData.image.sha` | init-chown-data container image sha (optional)| `""` | -| `initChownData.image.pullPolicy` | init-chown-data container image pull policy | `IfNotPresent` | -| `initChownData.resources` | init-chown-data pod resource requests & limits | `{}` | -| `schedulerName` | Alternate scheduler name | `nil` | -| `env` | Extra environment variables passed to pods | `{}` | -| `envValueFrom` | Environment variables from alternate sources. See the API docs on [EnvVarSource](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#envvarsource-v1-core) for format details. Can be templated | `{}` | -| `envFromSecret` | Name of a Kubernetes secret (must be manually created in the same namespace) containing values to be added to the environment. Can be templated | `""` | -| `envFromSecrets` | List of Kubernetes secrets (must be manually created in the same namespace) containing values to be added to the environment. Can be templated | `[]` | -| `envFromConfigMaps` | List of Kubernetes ConfigMaps (must be manually created in the same namespace) containing values to be added to the environment. Can be templated | `[]` | -| `envRenderSecret` | Sensible environment variables passed to pods and stored as secret. (passed through [tpl](https://helm.sh/docs/howto/charts_tips_and_tricks/#using-the-tpl-function)) | `{}` | -| `enableServiceLinks` | Inject Kubernetes services as environment variables. | `true` | -| `extraSecretMounts` | Additional grafana server secret mounts | `[]` | -| `extraVolumeMounts` | Additional grafana server volume mounts | `[]` | -| `createConfigmap` | Enable creating the grafana configmap | `true` | -| `extraConfigmapMounts` | Additional grafana server configMap volume mounts (values are templated) | `[]` | -| `extraEmptyDirMounts` | Additional grafana server emptyDir volume mounts | `[]` | -| `plugins` | Plugins to be loaded along with Grafana | `[]` | -| `datasources` | Configure grafana datasources (passed through tpl) | `{}` | -| `alerting` | Configure grafana alerting (passed through tpl) | `{}` | -| `notifiers` | Configure grafana notifiers | `{}` | -| `dashboardProviders` | Configure grafana dashboard providers | `{}` | -| `dashboards` | Dashboards to import | `{}` | -| `dashboardsConfigMaps` | ConfigMaps reference that contains dashboards | `{}` | -| `grafana.ini` | Grafana's primary configuration | `{}` | -| `global.imagePullSecrets` | Global image pull secrets (can be templated). Allows either an array of {name: pullSecret} maps (k8s-style), or an array of strings (more common helm-style). | `[]` | -| `ldap.enabled` | Enable LDAP authentication | `false` | -| `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 | `{}` | -| `labels` | Deployment labels | `{}` | -| `podAnnotations` | Pod annotations | `{}` | -| `podLabels` | Pod labels | `{}` | -| `podPortName` | Name of the grafana port on the pod | `grafana` | -| `lifecycleHooks` | Lifecycle hooks for podStart and preStop [Example](https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/#define-poststart-and-prestop-handlers) | `{}` | -| `sidecar.image.repository` | Sidecar image repository | `quay.io/kiwigrid/k8s-sidecar` | -| `sidecar.image.tag` | Sidecar image tag | `1.24.6` | -| `sidecar.image.sha` | Sidecar image sha (optional) | `""` | -| `sidecar.imagePullPolicy` | Sidecar image pull policy | `IfNotPresent` | -| `sidecar.resources` | Sidecar resources | `{}` | -| `sidecar.securityContext` | Sidecar securityContext | `{}` | -| `sidecar.enableUniqueFilenames` | Sets the kiwigrid/k8s-sidecar UNIQUE_FILENAMES environment variable. If set to `true` the sidecar will create unique filenames where duplicate data keys exist between ConfigMaps and/or Secrets within the same or multiple Namespaces. | `false` | -| `sidecar.alerts.enabled` | Enables the cluster wide search for alerts and adds/updates/deletes them in grafana |`false` | -| `sidecar.alerts.label` | Label that config maps with alerts should have to be added | `grafana_alert` | -| `sidecar.alerts.labelValue` | Label value that config maps with alerts should have to be added | `""` | -| `sidecar.alerts.searchNamespace` | Namespaces list. If specified, the sidecar will search for alerts config-maps inside these namespaces. Otherwise the namespace in which the sidecar is running will be used. It's also possible to specify ALL to search in all namespaces. | `nil` | -| `sidecar.alerts.watchMethod` | Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. | `WATCH` | -| `sidecar.alerts.resource` | Should the sidecar looks into secrets, configmaps or both. | `both` | -| `sidecar.alerts.reloadURL` | Full url of datasource configuration reload API endpoint, to invoke after a config-map change | `"http://localhost:3000/api/admin/provisioning/alerting/reload"` | -| `sidecar.alerts.skipReload` | Enabling this omits defining the REQ_URL and REQ_METHOD environment variables | `false` | -| `sidecar.alerts.initDatasources` | Set to true to deploy the datasource sidecar as an initContainer in addition to a container. This is needed if skipReload is true, to load any alerts defined at startup time. | `false` | -| `sidecar.alerts.extraMounts` | Additional alerts sidecar volume mounts. | `[]` | -| `sidecar.dashboards.enabled` | Enables the cluster wide search for dashboards and adds/updates/deletes them in grafana | `false` | -| `sidecar.dashboards.SCProvider` | Enables creation of sidecar provider | `true` | -| `sidecar.dashboards.provider.name` | Unique name of the grafana provider | `sidecarProvider` | -| `sidecar.dashboards.provider.orgid` | Id of the organisation, to which the dashboards should be added | `1` | -| `sidecar.dashboards.provider.folder` | Logical folder in which grafana groups dashboards | `""` | -| `sidecar.dashboards.provider.disableDelete` | Activate to avoid the deletion of imported dashboards | `false` | -| `sidecar.dashboards.provider.allowUiUpdates` | Allow updating provisioned dashboards from the UI | `false` | -| `sidecar.dashboards.provider.type` | Provider type | `file` | -| `sidecar.dashboards.provider.foldersFromFilesStructure` | Allow Grafana to replicate dashboard structure from filesystem. | `false` | -| `sidecar.dashboards.watchMethod` | Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. | `WATCH` | -| `sidecar.skipTlsVerify` | Set to true to skip tls verification for kube api calls | `nil` | -| `sidecar.dashboards.label` | Label that config maps with dashboards should have to be added | `grafana_dashboard` | -| `sidecar.dashboards.labelValue` | Label value that config maps with dashboards should have to be added | `""` | -| `sidecar.dashboards.folder` | Folder in the pod that should hold the collected dashboards (unless `sidecar.dashboards.defaultFolderName` is set). This path will be mounted. | `/tmp/dashboards` | -| `sidecar.dashboards.folderAnnotation` | The annotation the sidecar will look for in configmaps to override the destination folder for files | `nil` | -| `sidecar.dashboards.defaultFolderName` | The default folder name, it will create a subfolder under the `sidecar.dashboards.folder` and put dashboards in there instead | `nil` | -| `sidecar.dashboards.searchNamespace` | Namespaces list. If specified, the sidecar will search for dashboards config-maps inside these namespaces. Otherwise the namespace in which the sidecar is running will be used. It's also possible to specify ALL to search in all namespaces. | `nil` | -| `sidecar.dashboards.script` | Absolute path to shell script to execute after a configmap got reloaded. | `nil` | -| `sidecar.dashboards.reloadURL` | Full url of dashboards configuration reload API endpoint, to invoke after a config-map change | `"http://localhost:3000/api/admin/provisioning/dashboards/reload"` | -| `sidecar.dashboards.skipReload` | Enabling this omits defining the REQ_USERNAME, REQ_PASSWORD, REQ_URL and REQ_METHOD environment variables | `false` | -| `sidecar.dashboards.resource` | Should the sidecar looks into secrets, configmaps or both. | `both` | -| `sidecar.dashboards.extraMounts` | Additional dashboard sidecar volume mounts. | `[]` | -| `sidecar.datasources.enabled` | Enables 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 | `grafana_datasource` | -| `sidecar.datasources.labelValue` | Label value that config maps with datasources should have to be added | `""` | -| `sidecar.datasources.searchNamespace` | Namespaces list. If specified, the sidecar will search for datasources config-maps inside these namespaces. Otherwise the namespace in which the sidecar is running will be used. It's also possible to specify ALL to search in all namespaces. | `nil` | -| `sidecar.datasources.watchMethod` | Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. | `WATCH` | -| `sidecar.datasources.resource` | Should the sidecar looks into secrets, configmaps or both. | `both` | -| `sidecar.datasources.reloadURL` | Full url of datasource configuration reload API endpoint, to invoke after a config-map change | `"http://localhost:3000/api/admin/provisioning/datasources/reload"` | -| `sidecar.datasources.skipReload` | Enabling this omits defining the REQ_URL and REQ_METHOD environment variables | `false` | -| `sidecar.datasources.initDatasources` | Set to true to deploy the datasource sidecar as an initContainer in addition to a container. This is needed if skipReload is true, to load any datasources defined at startup time. | `false` | -| `sidecar.notifiers.enabled` | Enables the cluster wide search for notifiers and adds/updates/deletes them in grafana | `false` | -| `sidecar.notifiers.label` | Label that config maps with notifiers should have to be added | `grafana_notifier` | -| `sidecar.notifiers.labelValue` | Label value that config maps with notifiers should have to be added | `""` | -| `sidecar.notifiers.searchNamespace` | Namespaces list. If specified, the sidecar will search for notifiers config-maps (or secrets) inside these namespaces. Otherwise the namespace in which the sidecar is running will be used. It's also possible to specify ALL to search in all namespaces. | `nil` | -| `sidecar.notifiers.watchMethod` | Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. | `WATCH` | -| `sidecar.notifiers.resource` | Should the sidecar looks into secrets, configmaps or both. | `both` | -| `sidecar.notifiers.reloadURL` | Full url of notifier configuration reload API endpoint, to invoke after a config-map change | `"http://localhost:3000/api/admin/provisioning/notifications/reload"` | -| `sidecar.notifiers.skipReload` | Enabling this omits defining the REQ_URL and REQ_METHOD environment variables | `false` | -| `sidecar.notifiers.initNotifiers` | Set to true to deploy the notifier sidecar as an initContainer in addition to a container. This is needed if skipReload is true, to load any notifiers defined at startup time. | `false` | -| `smtp.existingSecret` | The name of an existing secret containing the SMTP credentials. | `""` | -| `smtp.userKey` | The key in the existing SMTP secret containing the username. | `"user"` | -| `smtp.passwordKey` | The key in the existing SMTP secret containing the password. | `"password"` | -| `admin.existingSecret` | The name of an existing secret containing the admin credentials (can be templated). | `""` | -| `admin.userKey` | The key in the existing admin secret containing the username. | `"admin-user"` | -| `admin.passwordKey` | The key in the existing admin secret containing the password. | `"admin-password"` | -| `serviceAccount.autoMount` | Automount the service account token in the pod| `true` | -| `serviceAccount.annotations` | ServiceAccount annotations | | -| `serviceAccount.create` | Create service account | `true` | -| `serviceAccount.labels` | ServiceAccount labels | `{}` | -| `serviceAccount.name` | Service account name to use, when empty will be set to created account if `serviceAccount.create` is set else to `default` | `` | -| `serviceAccount.nameTest` | Service account name to use for test, when empty will be set to created account if `serviceAccount.create` is set else to `default` | `nil` | -| `rbac.create` | Create and use RBAC resources | `true` | -| `rbac.namespaced` | Creates Role and Rolebinding instead of the default ClusterRole and ClusteRoleBindings for the grafana instance | `false` | -| `rbac.useExistingRole` | Set to a rolename to use existing role - skipping role creating - but still doing serviceaccount and rolebinding to the rolename set here. | `nil` | -| `rbac.pspEnabled` | Create PodSecurityPolicy (with `rbac.create`, grant roles permissions as well) | `false` | -| `rbac.pspUseAppArmor` | Enforce AppArmor in created PodSecurityPolicy (requires `rbac.pspEnabled`) | `false` | -| `rbac.extraRoleRules` | Additional rules to add to the Role | [] | -| `rbac.extraClusterRoleRules` | Additional rules to add to the ClusterRole | [] | -| `command` | Define command to be executed by grafana container at startup | `nil` | -| `args` | Define additional args if command is used | `nil` | -| `testFramework.enabled` | Whether to create test-related resources | `true` | -| `testFramework.image` | `test-framework` image repository. | `bats/bats` | -| `testFramework.tag` | `test-framework` image tag. | `v1.4.1` | -| `testFramework.imagePullPolicy` | `test-framework` image pull policy. | `IfNotPresent` | -| `testFramework.securityContext` | `test-framework` securityContext | `{}` | -| `downloadDashboards.env` | Environment variables to be passed to the `download-dashboards` container | `{}` | -| `downloadDashboards.envFromSecret` | Name of a Kubernetes secret (must be manually created in the same namespace) containing values to be added to the environment. Can be templated | `""` | -| `downloadDashboards.resources` | Resources of `download-dashboards` container | `{}` | -| `downloadDashboardsImage.repository` | Curl docker image repo | `curlimages/curl` | -| `downloadDashboardsImage.tag` | Curl docker image tag | `7.73.0` | -| `downloadDashboardsImage.sha` | Curl docker image sha (optional) | `""` | -| `downloadDashboardsImage.pullPolicy` | Curl docker image pull policy | `IfNotPresent` | -| `namespaceOverride` | Override the deployment namespace | `""` (`Release.Namespace`) | -| `serviceMonitor.enabled` | Use servicemonitor from prometheus operator | `false` | -| `serviceMonitor.namespace` | Namespace this servicemonitor is installed in | | -| `serviceMonitor.interval` | How frequently Prometheus should scrape | `1m` | -| `serviceMonitor.path` | Path to scrape | `/metrics` | -| `serviceMonitor.scheme` | Scheme to use for metrics scraping | `http` | -| `serviceMonitor.tlsConfig` | TLS configuration block for the endpoint | `{}` | -| `serviceMonitor.labels` | Labels for the servicemonitor passed to Prometheus Operator | `{}` | -| `serviceMonitor.scrapeTimeout` | Timeout after which the scrape is ended | `30s` | -| `serviceMonitor.relabelings` | RelabelConfigs to apply to samples before scraping. | `[]` | -| `serviceMonitor.metricRelabelings` | MetricRelabelConfigs to apply to samples before ingestion. | `[]` | -| `revisionHistoryLimit` | Number of old ReplicaSets to retain | `10` | -| `imageRenderer.enabled` | Enable the image-renderer deployment & service | `false` | -| `imageRenderer.image.repository` | image-renderer Image repository | `grafana/grafana-image-renderer` | -| `imageRenderer.image.tag` | image-renderer Image tag | `latest` | -| `imageRenderer.image.sha` | image-renderer Image sha (optional) | `""` | -| `imageRenderer.image.pullPolicy` | image-renderer ImagePullPolicy | `Always` | -| `imageRenderer.env` | extra env-vars for image-renderer | `{}` | -| `imageRenderer.envValueFrom` | Environment variables for image-renderer from alternate sources. See the API docs on [EnvVarSource](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#envvarsource-v1-core) for format details. Can be templated | `{}` | -| `imageRenderer.serviceAccountName` | image-renderer deployment serviceAccountName | `""` | -| `imageRenderer.securityContext` | image-renderer deployment securityContext | `{}` | -| `imageRenderer.hostAliases` | image-renderer deployment Host Aliases | `[]` | -| `imageRenderer.priorityClassName` | image-renderer deployment priority class | `''` | -| `imageRenderer.service.enabled` | Enable the image-renderer service | `true` | -| `imageRenderer.service.portName` | image-renderer service port name | `http` | -| `imageRenderer.service.port` | image-renderer port used by deployment | `8081` | -| `imageRenderer.service.targetPort` | image-renderer service port used by service | `8081` | -| `imageRenderer.appProtocol` | Adds the appProtocol field to the service | `` | -| `imageRenderer.grafanaSubPath` | Grafana sub path to use for image renderer callback url | `''` | -| `imageRenderer.podPortName` | name of the image-renderer port on the pod | `http` | -| `imageRenderer.revisionHistoryLimit` | number of image-renderer replica sets to keep | `10` | -| `imageRenderer.networkPolicy.limitIngress` | Enable a NetworkPolicy to limit inbound traffic from only the created grafana pods | `true` | -| `imageRenderer.networkPolicy.limitEgress` | Enable a NetworkPolicy to limit outbound traffic to only the created grafana pods | `false` | -| `imageRenderer.resources` | Set resource limits for image-renderer pods | `{}` | -| `imageRenderer.nodeSelector` | Node labels for pod assignment | `{}` | -| `imageRenderer.tolerations` | Toleration labels for pod assignment | `[]` | -| `imageRenderer.affinity` | Affinity settings for pod assignment | `{}` | -| `networkPolicy.enabled` | Enable creation of NetworkPolicy resources. | `false` | -| `networkPolicy.allowExternal` | Don't require client label for connections | `true` | -| `networkPolicy.explicitNamespacesSelector` | A Kubernetes LabelSelector to explicitly select namespaces from which traffic could be allowed | `{}` | -| `networkPolicy.ingress` | Enable the creation of an ingress network policy | `true` | -| `networkPolicy.egress.enabled` | Enable the creation of an egress network policy | `false` | -| `networkPolicy.egress.ports` | An array of ports to allow for the egress | `[]` | -| `enableKubeBackwardCompatibility` | Enable backward compatibility of kubernetes where pod's defintion version below 1.13 doesn't have the enableServiceLinks option | `false` | - -### Example ingress with path - -With grafana 6.3 and above - -```yaml -grafana.ini: - server: - domain: monitoring.example.com - root_url: "%(protocol)s://%(domain)s/grafana" - serve_from_sub_path: true -ingress: - enabled: true - hosts: - - "monitoring.example.com" - path: "/grafana" -``` - -### Example of extraVolumeMounts - -Volume can be type persistentVolumeClaim or hostPath but not both at same time. -If neither existingClaim or hostPath argument is given then type is emptyDir. - -```yaml -- extraVolumeMounts: - - name: plugins - mountPath: /var/lib/grafana/plugins - subPath: configs/grafana/plugins - existingClaim: existing-grafana-claim - readOnly: false - - name: dashboards - mountPath: /var/lib/grafana/dashboards - hostPath: /usr/shared/grafana/dashboards - readOnly: false -``` - -## Import dashboards - -There are a few methods to import dashboards to Grafana. Below are some examples and explanations as to how to use each method: - -```yaml -dashboards: - default: - some-dashboard: - json: | - { - "annotations": - - ... - # Complete json file here - ... - - "title": "Some Dashboard", - "uid": "abcd1234", - "version": 1 - } - custom-dashboard: - # This is a path to a file inside the dashboards directory inside the chart directory - file: dashboards/custom-dashboard.json - prometheus-stats: - # Ref: https://grafana.com/dashboards/2 - gnetId: 2 - revision: 2 - datasource: Prometheus - loki-dashboard-quick-search: - gnetId: 12019 - revision: 2 - datasource: - - name: DS_PROMETHEUS - value: Prometheus - - name: DS_LOKI - value: Loki - local-dashboard: - url: https://raw.githubusercontent.com/user/repository/master/dashboards/dashboard.json -``` - -## BASE64 dashboards - -Dashboards could be stored on a server that does not return JSON directly and instead of it returns a Base64 encoded file (e.g. Gerrit) -A new parameter has been added to the url use case so if you specify a b64content value equals to true after the url entry a Base64 decoding is applied before save the file to disk. -If this entry is not set or is equals to false not decoding is applied to the file before saving it to disk. - -### Gerrit use case - -Gerrit API for download files has the following schema: where {project-name} and -{file-id} usually has '/' in their values and so they MUST be replaced by %2F so if project-name is user/repo, branch-id is master and file-id is equals to dir1/dir2/dashboard -the url value is - -## Sidecar for dashboards - -If the parameter `sidecar.dashboards.enabled` is set, a sidecar container is deployed in the grafana -pod. This container watches all configmaps (or secrets) 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 a reduction of multiple dashboards inside -one configmap is currently not properly mirrored in grafana. - -Example dashboard config: - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: sample-grafana-dashboard - labels: - grafana_dashboard: "1" -data: - k8s-dashboard.json: |- - [...] -``` - -## Sidecar for datasources - -If the parameter `sidecar.datasources.enabled` is set, an init container is deployed in the grafana -pod. This container lists all secrets (or configmaps, though not recommended) in the cluster and -filters out the ones with a label as defined in `sidecar.datasources.label`. The files defined in -those secrets are written to a folder and accessed by grafana on startup. Using these yaml files, -the data sources in grafana can be imported. - -Should you aim for reloading datasources in Grafana each time the config is changed, set `sidecar.datasources.skipReload: false` and adjust `sidecar.datasources.reloadURL` to `http://..svc.cluster.local/api/admin/provisioning/datasources/reload`. - -Secrets are recommended over configmaps for this usecase because datasources usually contain private -data like usernames and passwords. Secrets are the more appropriate cluster resource to manage those. - -Example values to add a postgres datasource as a kubernetes secret: -```yaml -apiVersion: v1 -kind: Secret -metadata: - name: grafana-datasources - labels: - grafana_datasource: 'true' # default value for: sidecar.datasources.label -stringData: - pg-db.yaml: |- - apiVersion: 1 - datasources: - - name: My pg db datasource - type: postgres - url: my-postgresql-db:5432 - user: db-readonly-user - secureJsonData: - password: 'SUperSEcretPa$$word' - jsonData: - database: my_datase - sslmode: 'disable' # disable/require/verify-ca/verify-full - maxOpenConns: 0 # Grafana v5.4+ - maxIdleConns: 2 # Grafana v5.4+ - connMaxLifetime: 14400 # Grafana v5.4+ - postgresVersion: 1000 # 903=9.3, 904=9.4, 905=9.5, 906=9.6, 1000=10 - timescaledb: false - # allow users to edit datasources from the UI. - editable: false -``` - -Example values to add a datasource adapted from [Grafana](http://docs.grafana.org/administration/provisioning/#example-datasource-config-file): - -```yaml -datasources: - datasources.yaml: - apiVersion: 1 - datasources: - # name of the datasource. Required - - name: Graphite - # datasource type. Required - type: graphite - # access mode. proxy or direct (Server or Browser in the UI). Required - access: proxy - # org id. will default to orgId 1 if not specified - orgId: 1 - # url - url: http://localhost:8080 - # database password, if used - password: - # database user, if used - user: - # database name, if used - database: - # enable/disable basic auth - basicAuth: - # basic auth username - basicAuthUser: - # basic auth password - basicAuthPassword: - # enable/disable with credentials headers - withCredentials: - # mark as default datasource. Max one per org - isDefault: - # fields that will be converted to json and stored in json_data - jsonData: - graphiteVersion: "1.1" - tlsAuth: true - tlsAuthWithCACert: true - # json object of data that will be encrypted. - secureJsonData: - tlsCACert: "..." - tlsClientCert: "..." - tlsClientKey: "..." - version: 1 - # allow users to edit datasources from the UI. - editable: false -``` - -## Sidecar for notifiers - -If the parameter `sidecar.notifiers.enabled` is set, an init container is deployed in the grafana -pod. This container lists all secrets (or configmaps, though not recommended) in the cluster and -filters out the ones with a label as defined in `sidecar.notifiers.label`. The files defined in -those secrets are written to a folder and accessed by grafana on startup. Using these yaml files, -the notification channels in grafana can be imported. The secrets must be created before -`helm install` so that the notifiers init container can list the secrets. - -Secrets are recommended over configmaps for this usecase because alert notification channels usually contain -private data like SMTP usernames and passwords. Secrets are the more appropriate cluster resource to manage those. - -Example datasource config adapted from [Grafana](https://grafana.com/docs/grafana/latest/administration/provisioning/#alert-notification-channels): - -```yaml -notifiers: - - name: notification-channel-1 - type: slack - uid: notifier1 - # either - org_id: 2 - # or - org_name: Main Org. - is_default: true - send_reminder: true - frequency: 1h - disable_resolve_message: false - # See `Supported Settings` section for settings supporter for each - # alert notification type. - settings: - recipient: 'XXX' - token: 'xoxb' - uploadImage: true - url: https://slack.com - -delete_notifiers: - - name: notification-channel-1 - uid: notifier1 - org_id: 2 - - name: notification-channel-2 - # default org_id: 1 -``` - -## Provision alert rules, contact points, notification policies and notification templates - -There are two methods to provision alerting configuration in Grafana. Below are some examples and explanations as to how to use each method: - -```yaml -alerting: - team1-alert-rules.yaml: - file: alerting/team1/rules.yaml - team2-alert-rules.yaml: - file: alerting/team2/rules.yaml - team3-alert-rules.yaml: - file: alerting/team3/rules.yaml - notification-policies.yaml: - file: alerting/shared/notification-policies.yaml - notification-templates.yaml: - file: alerting/shared/notification-templates.yaml - contactpoints.yaml: - apiVersion: 1 - contactPoints: - - orgId: 1 - name: Slack channel - receivers: - - uid: default-receiver - type: slack - settings: - # Webhook URL to be filled in - url: "" - # We need to escape double curly braces for the tpl function. - text: '{{ `{{ template "default.message" . }}` }}' - title: '{{ `{{ template "default.title" . }}` }}' -``` - -There are two possibilities: - -* Inlining the file contents as described in the example `values.yaml` and the official [Grafana documentation](https://grafana.com/docs/grafana/next/alerting/set-up/provision-alerting-resources/file-provisioning/). -* Importing a file using a relative path starting from the chart root directory. - -### Important notes on file provisioning - -* The chart supports importing YAML and JSON files. -* The filename must be unique, otherwise one volume mount will overwrite the other. -* In case of inlining, double curly braces that arise from the Grafana configuration format and are not intended as templates for the chart must be escaped. -* The number of total files under `alerting:` is not limited. Each file will end up as a volume mount in the corresponding provisioning folder of the deployed Grafana instance. -* The file size for each import is limited by what the function `.Files.Get` can handle, which suffices for most cases. - -## How to serve Grafana with a path prefix (/grafana) - -In order to serve Grafana with a prefix (e.g., ), add the following to your values.yaml. - -```yaml -ingress: - enabled: true - annotations: - kubernetes.io/ingress.class: "nginx" - nginx.ingress.kubernetes.io/rewrite-target: /$1 - nginx.ingress.kubernetes.io/use-regex: "true" - - path: /grafana/?(.*) - hosts: - - k8s.example.dev - -grafana.ini: - server: - root_url: http://localhost:3000/grafana # this host can be localhost -``` - -## How to securely reference secrets in grafana.ini - -This example uses Grafana [file providers](https://grafana.com/docs/grafana/latest/administration/configuration/#file-provider) for secret values and the `extraSecretMounts` configuration flag (Additional grafana server secret mounts) to mount the secrets. - -In grafana.ini: - -```yaml -grafana.ini: - [auth.generic_oauth] - enabled = true - client_id = $__file{/etc/secrets/auth_generic_oauth/client_id} - client_secret = $__file{/etc/secrets/auth_generic_oauth/client_secret} -``` - -Existing secret, or created along with helm: - -```yaml ---- -apiVersion: v1 -kind: Secret -metadata: - name: auth-generic-oauth-secret -type: Opaque -stringData: - client_id: - client_secret: -``` - -Include in the `extraSecretMounts` configuration flag: - -```yaml -- extraSecretMounts: - - name: auth-generic-oauth-secret-mount - secretName: auth-generic-oauth-secret - defaultMode: 0440 - mountPath: /etc/secrets/auth_generic_oauth - readOnly: true -``` - -### extraSecretMounts using a Container Storage Interface (CSI) provider - -This example uses a CSI driver e.g. retrieving secrets using [Azure Key Vault Provider](https://github.com/Azure/secrets-store-csi-driver-provider-azure) - -```yaml -- extraSecretMounts: - - name: secrets-store-inline - mountPath: /run/secrets - readOnly: true - csi: - driver: secrets-store.csi.k8s.io - readOnly: true - volumeAttributes: - secretProviderClass: "my-provider" - nodePublishSecretRef: - name: akv-creds -``` - -## Image Renderer Plug-In - -This chart supports enabling [remote image rendering](https://github.com/grafana/grafana-image-renderer/blob/master/README.md#run-in-docker) - -```yaml -imageRenderer: - enabled: true -``` - -### Image Renderer NetworkPolicy - -By default the image-renderer pods will have a network policy which only allows ingress traffic from the created grafana instance - -### High Availability for unified alerting - -If you want to run Grafana in a high availability cluster you need to enable -the headless service by setting `headlessService: true` in your `values.yaml` -file. - -As next step you have to setup the `grafana.ini` in your `values.yaml` in a way -that it will make use of the headless service to obtain all the IPs of the -cluster. You should replace ``{{ Name }}`` with the name of your helm deployment. - -```yaml -grafana.ini: - ... - unified_alerting: - enabled: true - ha_peers: {{ Name }}-headless:9094 - ha_listen_address: ${POD_IP}:9094 - ha_advertise_address: ${POD_IP}:9094 - - alerting: - enabled: false -``` diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/dashboards/custom-dashboard.json b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/dashboards/custom-dashboard.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/dashboards/custom-dashboard.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/NOTES.txt b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/NOTES.txt deleted file mode 100644 index d86419fe23..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/NOTES.txt +++ /dev/null @@ -1,55 +0,0 @@ -1. Get your '{{ .Values.adminUser }}' user password by running: - - kubectl get secret --namespace {{ include "grafana.namespace" . }} {{ .Values.admin.existingSecret | default (include "grafana.fullname" .) }} -o jsonpath="{.data.{{ .Values.admin.passwordKey | default "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: - - {{ include "grafana.fullname" . }}.{{ include "grafana.namespace" . }}.svc.cluster.local -{{ if .Values.ingress.enabled }} - If you bind grafana to 80, please update values in values.yaml and reinstall: - ``` - securityContext: - runAsUser: 0 - runAsGroup: 0 - fsGroup: 0 - - command: - - "setcap" - - "'cap_net_bind_service=+ep'" - - "/usr/sbin/grafana-server &&" - - "sh" - - "/run.sh" - ``` - Details refer to https://grafana.com/docs/installation/configuration/#http-port. - Or grafana would always crash. - - 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 {{ include "grafana.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "grafana.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ include "grafana.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 {{ include "grafana.namespace" . }} -w {{ include "grafana.fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ include "grafana.namespace" . }} {{ include "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 {{ include "grafana.namespace" . }} -l "app.kubernetes.io/name={{ include "grafana.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - kubectl --namespace {{ include "grafana.namespace" . }} port-forward $POD_NAME 3000 - {{- end }} -{{- end }} - -3. Login with the password from step 1 and the username: {{ .Values.adminUser }} - -{{- if not .Values.persistence.enabled }} -################################################################################# -###### WARNING: Persistence is disabled!!! You will lose your data when ##### -###### the Grafana pod is terminated. ##### -################################################################################# -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/_helpers.tpl deleted file mode 100644 index ba64149aec..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/_helpers.tpl +++ /dev/null @@ -1,232 +0,0 @@ -# Rancher -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -{{/* 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 }} - -{{- define "grafana.serviceAccountNameTest" -}} -{{- if .Values.serviceAccount.create }} -{{- default (print (include "grafana.fullname" .) "-test") .Values.serviceAccount.nameTest }} -{{- else }} -{{- default "default" .Values.serviceAccount.nameTest }} -{{- end }} -{{- end }} - -{{/* -Allow the release namespace to be overridden for multi-namespace deployments in combined charts -*/}} -{{- define "grafana.namespace" -}} -{{- if .Values.namespaceOverride }} -{{- .Values.namespaceOverride }} -{{- else }} -{{- .Release.Namespace }} -{{- end }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "grafana.labels" -}} -helm.sh/chart: {{ include "grafana.chart" . }} -{{ include "grafana.selectorLabels" . }} -{{- if or .Chart.AppVersion .Values.image.tag }} -app.kubernetes.io/version: {{ mustRegexReplaceAllLiteral "@sha.*" .Values.image.tag "" | default .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- with .Values.extraLabels }} -{{ toYaml . }} -{{- end }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "grafana.selectorLabels" -}} -app.kubernetes.io/name: {{ include "grafana.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "grafana.imageRenderer.labels" -}} -helm.sh/chart: {{ include "grafana.chart" . }} -{{ include "grafana.imageRenderer.selectorLabels" . }} -{{- if or .Chart.AppVersion .Values.image.tag }} -app.kubernetes.io/version: {{ mustRegexReplaceAllLiteral "@sha.*" .Values.image.tag "" | default .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels ImageRenderer -*/}} -{{- define "grafana.imageRenderer.selectorLabels" -}} -app.kubernetes.io/name: {{ include "grafana.name" . }}-image-renderer -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Looks if there's an existing secret and reuse its password. If not it generates -new password and use it. -*/}} -{{- define "grafana.password" -}} -{{- $secret := (lookup "v1" "Secret" (include "grafana.namespace" .) (include "grafana.fullname" .) ) }} -{{- if $secret }} -{{- index $secret "data" "admin-password" }} -{{- else }} -{{- (randAlphaNum 40) | b64enc | quote }} -{{- end }} -{{- end }} - -{{/* -Return the appropriate apiVersion for rbac. -*/}} -{{- define "grafana.rbac.apiVersion" -}} -{{- if $.Capabilities.APIVersions.Has "rbac.authorization.k8s.io/v1" }} -{{- print "rbac.authorization.k8s.io/v1" }} -{{- else }} -{{- print "rbac.authorization.k8s.io/v1beta1" }} -{{- end }} -{{- end }} - -{{/* -Return the appropriate apiVersion for ingress. -*/}} -{{- define "grafana.ingress.apiVersion" -}} -{{- if and ($.Capabilities.APIVersions.Has "networking.k8s.io/v1") (semverCompare ">= 1.19-0" .Capabilities.KubeVersion.Version) }} -{{- print "networking.k8s.io/v1" }} -{{- else if $.Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }} -{{- print "networking.k8s.io/v1beta1" }} -{{- else }} -{{- print "extensions/v1beta1" }} -{{- end }} -{{- end }} - -{{/* -Return the appropriate apiVersion for Horizontal Pod Autoscaler. -*/}} -{{- define "grafana.hpa.apiVersion" -}} -{{- if $.Capabilities.APIVersions.Has "autoscaling/v2/HorizontalPodAutoscaler" }} -{{- print "autoscaling/v2" }} -{{- else if $.Capabilities.APIVersions.Has "autoscaling/v2beta2/HorizontalPodAutoscaler" }} -{{- print "autoscaling/v2beta2" }} -{{- else }} -{{- print "autoscaling/v2beta1" }} -{{- end }} -{{- end }} - -{{/* -Return the appropriate apiVersion for podDisruptionBudget. -*/}} -{{- define "grafana.podDisruptionBudget.apiVersion" -}} -{{- if $.Values.podDisruptionBudget.apiVersion }} -{{- print $.Values.podDisruptionBudget.apiVersion }} -{{- else if $.Capabilities.APIVersions.Has "policy/v1/PodDisruptionBudget" }} -{{- print "policy/v1" }} -{{- else }} -{{- print "policy/v1beta1" }} -{{- end }} -{{- end }} - -{{/* -Return if ingress is stable. -*/}} -{{- define "grafana.ingress.isStable" -}} -{{- eq (include "grafana.ingress.apiVersion" .) "networking.k8s.io/v1" }} -{{- end }} - -{{/* -Return if ingress supports ingressClassName. -*/}} -{{- define "grafana.ingress.supportsIngressClassName" -}} -{{- or (eq (include "grafana.ingress.isStable" .) "true") (and (eq (include "grafana.ingress.apiVersion" .) "networking.k8s.io/v1beta1") (semverCompare ">= 1.18-0" .Capabilities.KubeVersion.Version)) }} -{{- end }} - -{{/* -Return if ingress supports pathType. -*/}} -{{- define "grafana.ingress.supportsPathType" -}} -{{- or (eq (include "grafana.ingress.isStable" .) "true") (and (eq (include "grafana.ingress.apiVersion" .) "networking.k8s.io/v1beta1") (semverCompare ">= 1.18-0" .Capabilities.KubeVersion.Version)) }} -{{- end }} - -{{/* -Formats imagePullSecrets. Input is (dict "root" . "imagePullSecrets" .{specific imagePullSecrets}) -*/}} -{{- define "grafana.imagePullSecrets" -}} -{{- $root := .root }} -{{- range (concat .root.Values.global.imagePullSecrets .imagePullSecrets) }} -{{- if eq (typeOf .) "map[string]interface {}" }} -- {{ toYaml (dict "name" (tpl .name $root)) | trim }} -{{- else }} -- name: {{ tpl . $root }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/_pod.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/_pod.tpl deleted file mode 100644 index 12fcc3de09..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/_pod.tpl +++ /dev/null @@ -1,1162 +0,0 @@ -{{- define "grafana.pod" -}} -{{- $sts := list "sts" "StatefulSet" "statefulset" -}} -{{- $root := . -}} -{{- with .Values.schedulerName }} -schedulerName: "{{ . }}" -{{- end }} -serviceAccountName: {{ include "grafana.serviceAccountName" . }} -automountServiceAccountToken: {{ .Values.serviceAccount.autoMount }} -{{- with .Values.securityContext }} -securityContext: - {{- toYaml . | nindent 2 }} -{{- end }} -{{- with .Values.hostAliases }} -hostAliases: - {{- toYaml . | nindent 2 }} -{{- end }} -{{- with .Values.priorityClassName }} -priorityClassName: {{ . }} -{{- end }} -{{- if ( or .Values.persistence.enabled .Values.dashboards .Values.extraInitContainers (and .Values.sidecar.datasources.enabled .Values.sidecar.datasources.initDatasources) (and .Values.sidecar.notifiers.enabled .Values.sidecar.notifiers.initNotifiers)) }} -initContainers: -{{- end }} -{{- if ( and .Values.persistence.enabled .Values.initChownData.enabled ) }} - - name: init-chown-data - {{- if .Values.initChownData.image.sha }} - image: "{{ template "system_default_registry" . }}{{ .Values.initChownData.image.repository }}:{{ .Values.initChownData.image.tag }}@sha256:{{ .Values.initChownData.image.sha }}" - {{- else }} - image: "{{ template "system_default_registry" . }}{{ .Values.initChownData.image.repository }}:{{ .Values.initChownData.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.initChownData.image.pullPolicy }} - {{- with .Values.initChownData.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - command: - - chown - - -R - - {{ .Values.securityContext.runAsUser }}:{{ .Values.securityContext.runAsGroup }} - - /var/lib/grafana - {{- with .Values.initChownData.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: storage - mountPath: "/var/lib/grafana" - {{- with .Values.persistence.subPath }} - subPath: {{ tpl . $root }} - {{- end }} -{{- end }} -{{- if .Values.dashboards }} - - name: download-dashboards - {{- if .Values.downloadDashboardsImage.sha }} - image: "{{ template "system_default_registry" . }}{{ .Values.downloadDashboardsImage.repository }}:{{ .Values.downloadDashboardsImage.tag }}@sha256:{{ .Values.downloadDashboardsImage.sha }}" - {{- else }} - image: "{{ template "system_default_registry" . }}{{ .Values.downloadDashboardsImage.repository }}:{{ .Values.downloadDashboardsImage.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.downloadDashboardsImage.pullPolicy }} - command: ["/bin/sh"] - args: [ "-c", "mkdir -p /var/lib/grafana/dashboards/default && /bin/sh -x /etc/grafana/download_dashboards.sh" ] - {{- with .Values.downloadDashboards.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - env: - {{- range $key, $value := .Values.downloadDashboards.env }} - - name: "{{ $key }}" - value: "{{ $value }}" - {{- end }} - {{- range $key, $value := .Values.downloadDashboards.envValueFrom }} - - name: {{ $key | quote }} - valueFrom: - {{- tpl (toYaml $value) $ | nindent 10 }} - {{- end }} - {{- with .Values.downloadDashboards.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.downloadDashboards.envFromSecret }} - envFrom: - - secretRef: - name: {{ tpl . $root }} - {{- end }} - volumeMounts: - - name: config - mountPath: "/etc/grafana/download_dashboards.sh" - subPath: download_dashboards.sh - - name: storage - mountPath: "/var/lib/grafana" - {{- with .Values.persistence.subPath }} - subPath: {{ tpl . $root }} - {{- end }} - {{- range .Values.extraSecretMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - readOnly: {{ .readOnly }} - {{- end }} -{{- end }} -{{- if and .Values.sidecar.datasources.enabled .Values.sidecar.datasources.initDatasources }} - - name: {{ include "grafana.name" . }}-init-sc-datasources - {{- if .Values.sidecar.image.sha }} - image: "{{ template "system_default_registry" . }}{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" - {{- else }} - image: "{{ template "system_default_registry" . }}{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - {{- range $key, $value := .Values.sidecar.datasources.env }} - - name: "{{ $key }}" - value: "{{ $value }}" - {{- end }} - {{- if .Values.sidecar.datasources.ignoreAlreadyProcessed }} - - name: IGNORE_ALREADY_PROCESSED - value: "true" - {{- end }} - - name: METHOD - value: "LIST" - - name: LABEL - value: "{{ .Values.sidecar.datasources.label }}" - {{- with .Values.sidecar.datasources.labelValue }} - - name: LABEL_VALUE - value: {{ quote . }} - {{- end }} - {{- if or .Values.sidecar.logLevel .Values.sidecar.datasources.logLevel }} - - name: LOG_LEVEL - value: {{ default .Values.sidecar.logLevel .Values.sidecar.datasources.logLevel }} - {{- end }} - - name: FOLDER - value: "/etc/grafana/provisioning/datasources" - - name: RESOURCE - value: {{ quote .Values.sidecar.datasources.resource }} - {{- with .Values.sidecar.enableUniqueFilenames }} - - name: UNIQUE_FILENAMES - value: "{{ . }}" - {{- end }} - {{- if .Values.sidecar.datasources.searchNamespace }} - - name: NAMESPACE - value: "{{ tpl (.Values.sidecar.datasources.searchNamespace | join ",") . }}" - {{- end }} - {{- with .Values.sidecar.skipTlsVerify }} - - name: SKIP_TLS_VERIFY - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: sc-datasources-volume - mountPath: "/etc/grafana/provisioning/datasources" -{{- end }} -{{- if and .Values.sidecar.notifiers.enabled .Values.sidecar.notifiers.initNotifiers }} - - name: {{ include "grafana.name" . }}-init-sc-notifiers - {{- if .Values.sidecar.image.sha }} - image: "{{ template "system_default_registry" . }}{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" - {{- else }} - image: "{{ template "system_default_registry" . }}{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - {{- range $key, $value := .Values.sidecar.notifiers.env }} - - name: "{{ $key }}" - value: "{{ $value }}" - {{- end }} - {{- if .Values.sidecar.notifiers.ignoreAlreadyProcessed }} - - name: IGNORE_ALREADY_PROCESSED - value: "true" - {{- end }} - - name: METHOD - value: LIST - - name: LABEL - value: "{{ .Values.sidecar.notifiers.label }}" - {{- with .Values.sidecar.notifiers.labelValue }} - - name: LABEL_VALUE - value: {{ quote . }} - {{- end }} - {{- if or .Values.sidecar.logLevel .Values.sidecar.notifiers.logLevel }} - - name: LOG_LEVEL - value: {{ default .Values.sidecar.logLevel .Values.sidecar.notifiers.logLevel }} - {{- end }} - - name: FOLDER - value: "/etc/grafana/provisioning/notifiers" - - name: RESOURCE - value: {{ quote .Values.sidecar.notifiers.resource }} - {{- with .Values.sidecar.enableUniqueFilenames }} - - name: UNIQUE_FILENAMES - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.notifiers.searchNamespace }} - - name: NAMESPACE - value: "{{ tpl (. | join ",") $root }}" - {{- end }} - {{- with .Values.sidecar.skipTlsVerify }} - - name: SKIP_TLS_VERIFY - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: sc-notifiers-volume - mountPath: "/etc/grafana/provisioning/notifiers" -{{- end}} -{{- with .Values.extraInitContainers }} - {{- tpl (toYaml .) $root | nindent 2 }} -{{- end }} -{{- if or .Values.image.pullSecrets .Values.global.imagePullSecrets }} -imagePullSecrets: - {{- include "grafana.imagePullSecrets" (dict "root" $root "imagePullSecrets" .Values.image.pullSecrets) | nindent 2 }} -{{- end }} -{{- if not .Values.enableKubeBackwardCompatibility }} -enableServiceLinks: {{ .Values.enableServiceLinks }} -{{- end }} -containers: -{{- if .Values.sidecar.alerts.enabled }} - - name: {{ include "grafana.name" . }}-sc-alerts - {{- if .Values.sidecar.image.sha }} - image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" - {{- else }} - image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - {{- range $key, $value := .Values.sidecar.alerts.env }} - - name: "{{ $key }}" - value: "{{ $value }}" - {{- end }} - {{- if .Values.sidecar.alerts.ignoreAlreadyProcessed }} - - name: IGNORE_ALREADY_PROCESSED - value: "true" - {{- end }} - - name: METHOD - value: {{ .Values.sidecar.alerts.watchMethod }} - - name: LABEL - value: "{{ .Values.sidecar.alerts.label }}" - {{- with .Values.sidecar.alerts.labelValue }} - - name: LABEL_VALUE - value: {{ quote . }} - {{- end }} - {{- if or .Values.sidecar.logLevel .Values.sidecar.alerts.logLevel }} - - name: LOG_LEVEL - value: {{ default .Values.sidecar.logLevel .Values.sidecar.alerts.logLevel }} - {{- end }} - - name: FOLDER - value: "/etc/grafana/provisioning/alerting" - - name: RESOURCE - value: {{ quote .Values.sidecar.alerts.resource }} - {{- with .Values.sidecar.enableUniqueFilenames }} - - name: UNIQUE_FILENAMES - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.alerts.searchNamespace }} - - name: NAMESPACE - value: {{ . | join "," | quote }} - {{- end }} - {{- with .Values.sidecar.alerts.skipTlsVerify }} - - name: SKIP_TLS_VERIFY - value: {{ quote . }} - {{- end }} - {{- with .Values.sidecar.alerts.script }} - - name: SCRIPT - value: {{ quote . }} - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_USER) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_USERNAME - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.userKey | default "admin-user" }} - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_PASSWORD - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.passwordKey | default "admin-password" }} - {{- end }} - {{- if not .Values.sidecar.alerts.skipReload }} - - name: REQ_URL - value: {{ .Values.sidecar.alerts.reloadURL }} - - name: REQ_METHOD - value: POST - {{- end }} - {{- if .Values.sidecar.alerts.watchServerTimeout }} - {{- if ne .Values.sidecar.alerts.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.alerts.watchServerTimeout with .Values.sidecar.alerts.watchMethod %s" .Values.sidecar.alerts.watchMethod) }} - {{- end }} - - name: WATCH_SERVER_TIMEOUT - value: "{{ .Values.sidecar.alerts.watchServerTimeout }}" - {{- end }} - {{- if .Values.sidecar.alerts.watchClientTimeout }} - {{- if ne .Values.sidecar.alerts.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.alerts.watchClientTimeout with .Values.sidecar.alerts.watchMethod %s" .Values.sidecar.alerts.watchMethod) }} - {{- end }} - - name: WATCH_CLIENT_TIMEOUT - value: "{{ .Values.sidecar.alerts.watchClientTimeout }}" - {{- end }} - {{- with .Values.sidecar.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: sc-alerts-volume - mountPath: "/etc/grafana/provisioning/alerting" - {{- with .Values.sidecar.alerts.extraMounts }} - {{- toYaml . | trim | nindent 6 }} - {{- end }} -{{- end}} -{{- if .Values.sidecar.dashboards.enabled }} - - name: {{ include "grafana.name" . }}-sc-dashboard - {{- if .Values.sidecar.image.sha }} - image: "{{ template "system_default_registry" . }}{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" - {{- else }} - image: "{{ template "system_default_registry" . }}{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - {{- range $key, $value := .Values.sidecar.dashboards.env }} - - name: "{{ $key }}" - value: "{{ $value }}" - {{- end }} - {{- if .Values.sidecar.dashboards.ignoreAlreadyProcessed }} - - name: IGNORE_ALREADY_PROCESSED - value: "true" - {{- end }} - - name: METHOD - value: {{ .Values.sidecar.dashboards.watchMethod }} - - name: LABEL - value: "{{ .Values.sidecar.dashboards.label }}" - {{- with .Values.sidecar.dashboards.labelValue }} - - name: LABEL_VALUE - value: {{ quote . }} - {{- end }} - {{- if or .Values.sidecar.logLevel .Values.sidecar.dashboards.logLevel }} - - name: LOG_LEVEL - value: {{ default .Values.sidecar.logLevel .Values.sidecar.dashboards.logLevel }} - {{- end }} - - name: FOLDER - value: "{{ .Values.sidecar.dashboards.folder }}{{- with .Values.sidecar.dashboards.defaultFolderName }}/{{ . }}{{- end }}" - - name: RESOURCE - value: {{ quote .Values.sidecar.dashboards.resource }} - {{- with .Values.sidecar.enableUniqueFilenames }} - - name: UNIQUE_FILENAMES - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.dashboards.searchNamespace }} - - name: NAMESPACE - value: "{{ tpl (. | join ",") $root }}" - {{- end }} - {{- with .Values.sidecar.skipTlsVerify }} - - name: SKIP_TLS_VERIFY - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.dashboards.folderAnnotation }} - - name: FOLDER_ANNOTATION - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.dashboards.script }} - - name: SCRIPT - value: "{{ . }}" - {{- end }} - {{- if not .Values.sidecar.dashboards.skipReload }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_USER) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_USERNAME - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.userKey | default "admin-user" }} - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_PASSWORD - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.passwordKey | default "admin-password" }} - {{- end }} - - name: REQ_URL - value: {{ .Values.sidecar.dashboards.reloadURL }} - - name: REQ_METHOD - value: POST - {{- end }} - {{- if .Values.sidecar.dashboards.watchServerTimeout }} - {{- if ne .Values.sidecar.dashboards.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.dashboards.watchServerTimeout with .Values.sidecar.dashboards.watchMethod %s" .Values.sidecar.dashboards.watchMethod) }} - {{- end }} - - name: WATCH_SERVER_TIMEOUT - value: "{{ .Values.sidecar.dashboards.watchServerTimeout }}" - {{- end }} - {{- if .Values.sidecar.dashboards.watchClientTimeout }} - {{- if ne .Values.sidecar.dashboards.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.dashboards.watchClientTimeout with .Values.sidecar.dashboards.watchMethod %s" .Values.sidecar.dashboards.watchMethod) }} - {{- end }} - - name: WATCH_CLIENT_TIMEOUT - value: {{ .Values.sidecar.dashboards.watchClientTimeout | quote }} - {{- end }} - {{- with .Values.sidecar.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: sc-dashboard-volume - mountPath: {{ .Values.sidecar.dashboards.folder | quote }} - {{- with .Values.sidecar.dashboards.extraMounts }} - {{- toYaml . | trim | nindent 6 }} - {{- end }} -{{- end}} -{{- if .Values.sidecar.datasources.enabled }} - - name: {{ include "grafana.name" . }}-sc-datasources - {{- if .Values.sidecar.image.sha }} - image: "{{ template "system_default_registry" . }}{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" - {{- else }} - image: "{{ template "system_default_registry" . }}{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - {{- range $key, $value := .Values.sidecar.datasources.env }} - - name: "{{ $key }}" - value: "{{ $value }}" - {{- end }} - {{- if .Values.sidecar.datasources.ignoreAlreadyProcessed }} - - name: IGNORE_ALREADY_PROCESSED - value: "true" - {{- end }} - - name: METHOD - value: {{ .Values.sidecar.datasources.watchMethod }} - - name: LABEL - value: "{{ .Values.sidecar.datasources.label }}" - {{- with .Values.sidecar.datasources.labelValue }} - - name: LABEL_VALUE - value: {{ quote . }} - {{- end }} - {{- if or .Values.sidecar.logLevel .Values.sidecar.datasources.logLevel }} - - name: LOG_LEVEL - value: {{ default .Values.sidecar.logLevel .Values.sidecar.datasources.logLevel }} - {{- end }} - - name: FOLDER - value: "/etc/grafana/provisioning/datasources" - - name: RESOURCE - value: {{ quote .Values.sidecar.datasources.resource }} - {{- with .Values.sidecar.enableUniqueFilenames }} - - name: UNIQUE_FILENAMES - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.datasources.searchNamespace }} - - name: NAMESPACE - value: "{{ tpl (. | join ",") $root }}" - {{- end }} - {{- if .Values.sidecar.skipTlsVerify }} - - name: SKIP_TLS_VERIFY - value: "{{ .Values.sidecar.skipTlsVerify }}" - {{- end }} - {{- if .Values.sidecar.datasources.script }} - - name: SCRIPT - value: "{{ .Values.sidecar.datasources.script }}" - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_USER) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_USERNAME - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.userKey | default "admin-user" }} - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_PASSWORD - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.passwordKey | default "admin-password" }} - {{- end }} - {{- if not .Values.sidecar.datasources.skipReload }} - - name: REQ_URL - value: {{ .Values.sidecar.datasources.reloadURL }} - - name: REQ_METHOD - value: POST - {{- end }} - {{- if .Values.sidecar.datasources.watchServerTimeout }} - {{- if ne .Values.sidecar.datasources.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.datasources.watchServerTimeout with .Values.sidecar.datasources.watchMethod %s" .Values.sidecar.datasources.watchMethod) }} - {{- end }} - - name: WATCH_SERVER_TIMEOUT - value: "{{ .Values.sidecar.datasources.watchServerTimeout }}" - {{- end }} - {{- if .Values.sidecar.datasources.watchClientTimeout }} - {{- if ne .Values.sidecar.datasources.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.datasources.watchClientTimeout with .Values.sidecar.datasources.watchMethod %s" .Values.sidecar.datasources.watchMethod) }} - {{- end }} - - name: WATCH_CLIENT_TIMEOUT - value: "{{ .Values.sidecar.datasources.watchClientTimeout }}" - {{- end }} - {{- with .Values.sidecar.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: sc-datasources-volume - mountPath: "/etc/grafana/provisioning/datasources" -{{- end}} -{{- if .Values.sidecar.notifiers.enabled }} - - name: {{ include "grafana.name" . }}-sc-notifiers - {{- if .Values.sidecar.image.sha }} - image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" - {{- else }} - image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - {{- range $key, $value := .Values.sidecar.notifiers.env }} - - name: "{{ $key }}" - value: "{{ $value }}" - {{- end }} - {{- if .Values.sidecar.notifiers.ignoreAlreadyProcessed }} - - name: IGNORE_ALREADY_PROCESSED - value: "true" - {{- end }} - - name: METHOD - value: {{ .Values.sidecar.notifiers.watchMethod }} - - name: LABEL - value: "{{ .Values.sidecar.notifiers.label }}" - {{- with .Values.sidecar.notifiers.labelValue }} - - name: LABEL_VALUE - value: {{ quote . }} - {{- end }} - {{- if or .Values.sidecar.logLevel .Values.sidecar.notifiers.logLevel }} - - name: LOG_LEVEL - value: {{ default .Values.sidecar.logLevel .Values.sidecar.notifiers.logLevel }} - {{- end }} - - name: FOLDER - value: "/etc/grafana/provisioning/notifiers" - - name: RESOURCE - value: {{ quote .Values.sidecar.notifiers.resource }} - {{- if .Values.sidecar.enableUniqueFilenames }} - - name: UNIQUE_FILENAMES - value: "{{ .Values.sidecar.enableUniqueFilenames }}" - {{- end }} - {{- with .Values.sidecar.notifiers.searchNamespace }} - - name: NAMESPACE - value: "{{ tpl (. | join ",") $root }}" - {{- end }} - {{- with .Values.sidecar.skipTlsVerify }} - - name: SKIP_TLS_VERIFY - value: "{{ . }}" - {{- end }} - {{- if .Values.sidecar.notifiers.script }} - - name: SCRIPT - value: "{{ .Values.sidecar.notifiers.script }}" - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_USER) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_USERNAME - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.userKey | default "admin-user" }} - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_PASSWORD - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.passwordKey | default "admin-password" }} - {{- end }} - {{- if not .Values.sidecar.notifiers.skipReload }} - - name: REQ_URL - value: {{ .Values.sidecar.notifiers.reloadURL }} - - name: REQ_METHOD - value: POST - {{- end }} - {{- if .Values.sidecar.notifiers.watchServerTimeout }} - {{- if ne .Values.sidecar.notifiers.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.notifiers.watchServerTimeout with .Values.sidecar.notifiers.watchMethod %s" .Values.sidecar.notifiers.watchMethod) }} - {{- end }} - - name: WATCH_SERVER_TIMEOUT - value: "{{ .Values.sidecar.notifiers.watchServerTimeout }}" - {{- end }} - {{- if .Values.sidecar.notifiers.watchClientTimeout }} - {{- if ne .Values.sidecar.notifiers.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.notifiers.watchClientTimeout with .Values.sidecar.notifiers.watchMethod %s" .Values.sidecar.notifiers.watchMethod) }} - {{- end }} - - name: WATCH_CLIENT_TIMEOUT - value: "{{ .Values.sidecar.notifiers.watchClientTimeout }}" - {{- end }} - {{- with .Values.sidecar.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: sc-notifiers-volume - mountPath: "/etc/grafana/provisioning/notifiers" -{{- end}} -{{- if .Values.sidecar.plugins.enabled }} - - name: {{ include "grafana.name" . }}-sc-plugins - {{- if .Values.sidecar.image.sha }} - image: "{{ template "system_default_registry" . }}{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" - {{- else }} - image: "{{ template "system_default_registry" . }}{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - {{- range $key, $value := .Values.sidecar.plugins.env }} - - name: "{{ $key }}" - value: "{{ $value }}" - {{- end }} - {{- if .Values.sidecar.plugins.ignoreAlreadyProcessed }} - - name: IGNORE_ALREADY_PROCESSED - value: "true" - {{- end }} - - name: METHOD - value: {{ .Values.sidecar.plugins.watchMethod }} - - name: LABEL - value: "{{ .Values.sidecar.plugins.label }}" - {{- if .Values.sidecar.plugins.labelValue }} - - name: LABEL_VALUE - value: {{ quote .Values.sidecar.plugins.labelValue }} - {{- end }} - {{- if or .Values.sidecar.logLevel .Values.sidecar.plugins.logLevel }} - - name: LOG_LEVEL - value: {{ default .Values.sidecar.logLevel .Values.sidecar.plugins.logLevel }} - {{- end }} - - name: FOLDER - value: "/etc/grafana/provisioning/plugins" - - name: RESOURCE - value: {{ quote .Values.sidecar.plugins.resource }} - {{- with .Values.sidecar.enableUniqueFilenames }} - - name: UNIQUE_FILENAMES - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.plugins.searchNamespace }} - - name: NAMESPACE - value: "{{ tpl (. | join ",") $root }}" - {{- end }} - {{- with .Values.sidecar.plugins.script }} - - name: SCRIPT - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.skipTlsVerify }} - - name: SKIP_TLS_VERIFY - value: "{{ . }}" - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_USER) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_USERNAME - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.userKey | default "admin-user" }} - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_PASSWORD - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.passwordKey | default "admin-password" }} - {{- end }} - {{- if not .Values.sidecar.plugins.skipReload }} - - name: REQ_URL - value: {{ .Values.sidecar.plugins.reloadURL }} - - name: REQ_METHOD - value: POST - {{- end }} - {{- if .Values.sidecar.plugins.watchServerTimeout }} - {{- if ne .Values.sidecar.plugins.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.plugins.watchServerTimeout with .Values.sidecar.plugins.watchMethod %s" .Values.sidecar.plugins.watchMethod) }} - {{- end }} - - name: WATCH_SERVER_TIMEOUT - value: "{{ .Values.sidecar.plugins.watchServerTimeout }}" - {{- end }} - {{- if .Values.sidecar.plugins.watchClientTimeout }} - {{- if ne .Values.sidecar.plugins.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.plugins.watchClientTimeout with .Values.sidecar.plugins.watchMethod %s" .Values.sidecar.plugins.watchMethod) }} - {{- end }} - - name: WATCH_CLIENT_TIMEOUT - value: "{{ .Values.sidecar.plugins.watchClientTimeout }}" - {{- end }} - {{- with .Values.sidecar.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: sc-plugins-volume - mountPath: "/etc/grafana/provisioning/plugins" -{{- end}} - - name: {{ .Chart.Name }} - {{- if .Values.image.sha }} - image: "{{ template "system_default_registry" . }}{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}@sha256:{{ .Values.image.sha }}" - {{- else }} - image: "{{ template "system_default_registry" . }}{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" - {{- end }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - {{- if .Values.command }} - command: - {{- range .Values.command }} - - {{ . | quote }} - {{- end }} - {{- end }} - {{- if .Values.args }} - args: - {{- range .Values.args }} - - {{ . | quote }} - {{- end }} - {{- end }} - {{- with .Values.containerSecurityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: config - mountPath: "/etc/grafana/grafana.ini" - subPath: grafana.ini - {{- if .Values.ldap.enabled }} - - name: ldap - mountPath: "/etc/grafana/ldap.toml" - subPath: ldap.toml - {{- end }} - {{- range .Values.extraConfigmapMounts }} - - name: {{ tpl .name $root }} - mountPath: {{ tpl .mountPath $root }} - subPath: {{ tpl (.subPath | default "") $root }} - readOnly: {{ .readOnly }} - {{- end }} - - name: storage - mountPath: "/var/lib/grafana" - {{- with .Values.persistence.subPath }} - subPath: {{ tpl . $root }} - {{- end }} - {{- with .Values.dashboards }} - {{- range $provider, $dashboards := . }} - {{- range $key, $value := $dashboards }} - {{- if (or (hasKey $value "json") (hasKey $value "file")) }} - - name: dashboards-{{ $provider }} - mountPath: "/var/lib/grafana/dashboards/{{ $provider }}/{{ $key }}.json" - subPath: "{{ $key }}.json" - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- with .Values.dashboardsConfigMaps }} - {{- range (keys . | sortAlpha) }} - - name: dashboards-{{ . }} - mountPath: "/var/lib/grafana/dashboards/{{ . }}" - {{- end }} - {{- end }} - {{- with .Values.datasources }} - {{- range (keys . | sortAlpha) }} - - name: config - mountPath: "/etc/grafana/provisioning/datasources/{{ . }}" - subPath: {{ . | quote }} - {{- end }} - {{- end }} - {{- with .Values.notifiers }} - {{- range (keys . | sortAlpha) }} - - name: config - mountPath: "/etc/grafana/provisioning/notifiers/{{ . }}" - subPath: {{ . | quote }} - {{- end }} - {{- end }} - {{- with .Values.alerting }} - {{- range (keys . | sortAlpha) }} - - name: config - mountPath: "/etc/grafana/provisioning/alerting/{{ . }}" - subPath: {{ . | quote }} - {{- end }} - {{- end }} - {{- with .Values.dashboardProviders }} - {{- range (keys . | sortAlpha) }} - - name: config - mountPath: "/etc/grafana/provisioning/dashboards/{{ . }}" - subPath: {{ . | quote }} - {{- end }} - {{- end }} - {{- with .Values.sidecar.alerts.enabled }} - - name: sc-alerts-volume - mountPath: "/etc/grafana/provisioning/alerting" - {{- end}} - {{- if .Values.sidecar.dashboards.enabled }} - - name: sc-dashboard-volume - mountPath: {{ .Values.sidecar.dashboards.folder | quote }} - {{- if .Values.sidecar.dashboards.SCProvider }} - - name: sc-dashboard-provider - mountPath: "/etc/grafana/provisioning/dashboards/sc-dashboardproviders.yaml" - subPath: provider.yaml - {{- end}} - {{- end}} - {{- if .Values.sidecar.datasources.enabled }} - - name: sc-datasources-volume - mountPath: "/etc/grafana/provisioning/datasources" - {{- end}} - {{- if .Values.sidecar.plugins.enabled }} - - name: sc-plugins-volume - mountPath: "/etc/grafana/provisioning/plugins" - {{- end}} - {{- if .Values.sidecar.notifiers.enabled }} - - name: sc-notifiers-volume - mountPath: "/etc/grafana/provisioning/notifiers" - {{- end}} - {{- range .Values.extraSecretMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - readOnly: {{ .readOnly }} - subPath: {{ .subPath | default "" }} - {{- end }} - {{- range .Values.extraVolumeMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath | default "" }} - readOnly: {{ .readOnly }} - {{- end }} - {{- range .Values.extraEmptyDirMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - {{- end }} - ports: - - name: {{ .Values.podPortName }} - containerPort: {{ .Values.service.targetPort }} - protocol: TCP - - name: {{ .Values.gossipPortName }}-tcp - containerPort: 9094 - protocol: TCP - - name: {{ .Values.gossipPortName }}-udp - containerPort: 9094 - protocol: UDP - env: - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - {{- if and (not .Values.env.GF_SECURITY_ADMIN_USER) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: GF_SECURITY_ADMIN_USER - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.userKey | default "admin-user" }} - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: GF_SECURITY_ADMIN_PASSWORD - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.passwordKey | default "admin-password" }} - {{- end }} - {{- if .Values.plugins }} - - name: GF_INSTALL_PLUGINS - valueFrom: - configMapKeyRef: - name: {{ include "grafana.fullname" . }} - key: plugins - {{- end }} - {{- if .Values.smtp.existingSecret }} - - name: GF_SMTP_USER - valueFrom: - secretKeyRef: - name: {{ .Values.smtp.existingSecret }} - key: {{ .Values.smtp.userKey | default "user" }} - - name: GF_SMTP_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.smtp.existingSecret }} - key: {{ .Values.smtp.passwordKey | default "password" }} - {{- end }} - {{- if .Values.imageRenderer.enabled }} - - name: GF_RENDERING_SERVER_URL - value: http://{{ include "grafana.fullname" . }}-image-renderer.{{ include "grafana.namespace" . }}:{{ .Values.imageRenderer.service.port }}/render - - name: GF_RENDERING_CALLBACK_URL - value: {{ .Values.imageRenderer.grafanaProtocol }}://{{ include "grafana.fullname" . }}.{{ include "grafana.namespace" . }}:{{ .Values.service.port }}/{{ .Values.imageRenderer.grafanaSubPath }} - {{- end }} - - name: GF_PATHS_DATA - value: {{ (get .Values "grafana.ini").paths.data }} - - name: GF_PATHS_LOGS - value: {{ (get .Values "grafana.ini").paths.logs }} - - name: GF_PATHS_PLUGINS - value: {{ (get .Values "grafana.ini").paths.plugins }} - - name: GF_PATHS_PROVISIONING - value: {{ (get .Values "grafana.ini").paths.provisioning }} - {{- range $key, $value := .Values.envValueFrom }} - - name: {{ $key | quote }} - valueFrom: - {{- tpl (toYaml $value) $ | nindent 10 }} - {{- end }} - {{- range $key, $value := .Values.env }} - - name: "{{ tpl $key $ }}" - value: "{{ tpl (print $value) $ }}" - {{- end }} - {{- if or .Values.envFromSecret (or .Values.envRenderSecret .Values.envFromSecrets) .Values.envFromConfigMaps }} - envFrom: - {{- if .Values.envFromSecret }} - - secretRef: - name: {{ tpl .Values.envFromSecret . }} - {{- end }} - {{- if .Values.envRenderSecret }} - - secretRef: - name: {{ include "grafana.fullname" . }}-env - {{- end }} - {{- range .Values.envFromSecrets }} - - secretRef: - name: {{ tpl .name $ }} - optional: {{ .optional | default false }} - {{- end }} - {{- range .Values.envFromConfigMaps }} - - configMapRef: - name: {{ tpl .name $ }} - optional: {{ .optional | default false }} - {{- end }} - {{- end }} - {{- with .Values.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.lifecycleHooks }} - lifecycle: - {{- tpl (toYaml .) $root | nindent 6 }} - {{- end }} - {{- with .Values.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} -{{- with .Values.extraContainers }} - {{- tpl . $ | nindent 2 }} -{{- end }} -nodeSelector: {{ include "linux-node-selector" . | nindent 2 }} -{{- if .Values.nodeSelector }} -{{ toYaml .Values.nodeSelector | indent 2 }} -{{- end }} -{{- with .Values.affinity }} -affinity: - {{- tpl (toYaml .) $root | nindent 2 }} -{{- end }} -{{- with .Values.topologySpreadConstraints }} -topologySpreadConstraints: - {{- toYaml . | nindent 2 }} -{{- end }} -tolerations: {{ include "linux-node-tolerations" . | nindent 2 }} -{{- if .Values.tolerations }} -{{ toYaml .Values.tolerations | indent 2 }} -{{- end }} -volumes: - - name: config - configMap: - name: {{ include "grafana.fullname" . }} - {{- range .Values.extraConfigmapMounts }} - - name: {{ tpl .name $root }} - configMap: - name: {{ tpl .configMap $root }} - {{- with .items }} - items: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- end }} - {{- if .Values.dashboards }} - {{- range (keys .Values.dashboards | sortAlpha) }} - - name: dashboards-{{ . }} - configMap: - name: {{ include "grafana.fullname" $ }}-dashboards-{{ . }} - {{- end }} - {{- end }} - {{- if .Values.dashboardsConfigMaps }} - {{- range $provider, $name := .Values.dashboardsConfigMaps }} - - name: dashboards-{{ $provider }} - configMap: - name: {{ tpl $name $root }} - {{- end }} - {{- end }} - {{- if .Values.ldap.enabled }} - - name: ldap - secret: - {{- if .Values.ldap.existingSecret }} - secretName: {{ .Values.ldap.existingSecret }} - {{- else }} - secretName: {{ include "grafana.fullname" . }} - {{- end }} - items: - - key: ldap-toml - path: ldap.toml - {{- end }} - {{- if and .Values.persistence.enabled (eq .Values.persistence.type "pvc") }} - - name: storage - persistentVolumeClaim: - claimName: {{ tpl (.Values.persistence.existingClaim | default (include "grafana.fullname" .)) . }} - {{- else if and .Values.persistence.enabled (has .Values.persistence.type $sts) }} - {{/* nothing */}} - {{- else }} - - name: storage - {{- if .Values.persistence.inMemory.enabled }} - emptyDir: - medium: Memory - {{- with .Values.persistence.inMemory.sizeLimit }} - sizeLimit: {{ . }} - {{- end }} - {{- else }} - emptyDir: {} - {{- end }} - {{- end }} - {{- if .Values.sidecar.alerts.enabled }} - - name: sc-alerts-volume - emptyDir: - {{- with .Values.sidecar.alerts.sizeLimit }} - sizeLimit: {{ . }} - {{- else }} - {} - {{- end }} - {{- end }} - {{- if .Values.sidecar.dashboards.enabled }} - - name: sc-dashboard-volume - emptyDir: - {{- with .Values.sidecar.dashboards.sizeLimit }} - sizeLimit: {{ . }} - {{- else }} - {} - {{- end }} - {{- if .Values.sidecar.dashboards.SCProvider }} - - name: sc-dashboard-provider - configMap: - name: {{ include "grafana.fullname" . }}-config-dashboards - {{- end }} - {{- end }} - {{- if .Values.sidecar.datasources.enabled }} - - name: sc-datasources-volume - emptyDir: - {{- with .Values.sidecar.datasources.sizeLimit }} - sizeLimit: {{ . }} - {{- else }} - {} - {{- end }} - {{- end }} - {{- if .Values.sidecar.plugins.enabled }} - - name: sc-plugins-volume - emptyDir: - {{- with .Values.sidecar.plugins.sizeLimit }} - sizeLimit: {{ . }} - {{- else }} - {} - {{- end }} - {{- end }} - {{- if .Values.sidecar.notifiers.enabled }} - - name: sc-notifiers-volume - emptyDir: - {{- with .Values.sidecar.notifiers.sizeLimit }} - sizeLimit: {{ . }} - {{- else }} - {} - {{- end }} - {{- end }} - {{- range .Values.extraSecretMounts }} - {{- if .secretName }} - - name: {{ .name }} - secret: - secretName: {{ .secretName }} - defaultMode: {{ .defaultMode }} - {{- with .items }} - items: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- else if .projected }} - - name: {{ .name }} - projected: - {{- toYaml .projected | nindent 6 }} - {{- else if .csi }} - - name: {{ .name }} - csi: - {{- toYaml .csi | nindent 6 }} - {{- end }} - {{- end }} - {{- range .Values.extraVolumeMounts }} - - name: {{ .name }} - {{- if .existingClaim }} - persistentVolumeClaim: - claimName: {{ .existingClaim }} - {{- else if .hostPath }} - hostPath: - path: {{ .hostPath }} - {{- else if .csi }} - csi: - {{- toYaml .data | nindent 6 }} - {{- else }} - emptyDir: {} - {{- end }} - {{- end }} - {{- range .Values.extraEmptyDirMounts }} - - name: {{ .name }} - emptyDir: {} - {{- end }} - {{- with .Values.extraContainerVolumes }} - {{- tpl (toYaml .) $root | nindent 2 }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/clusterrole.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/clusterrole.yaml deleted file mode 100644 index 2c9a1801ac..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/clusterrole.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if and .Values.rbac.create (or (not .Values.rbac.namespaced) .Values.rbac.extraClusterRoleRules) (not .Values.rbac.useExistingRole) }} -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "grafana.fullname" . }}-clusterrole -{{- if or .Values.sidecar.dashboards.enabled .Values.rbac.extraClusterRoleRules .Values.sidecar.datasources.enabled .Values.sidecar.plugins.enabled .Values.sidecar.alerts.enabled }} -rules: - {{- if or .Values.sidecar.dashboards.enabled .Values.sidecar.datasources.enabled .Values.sidecar.plugins.enabled .Values.sidecar.alerts.enabled }} - - apiGroups: [""] # "" indicates the core API group - resources: ["configmaps", "secrets"] - verbs: ["get", "watch", "list"] - {{- end}} - {{- with .Values.rbac.extraClusterRoleRules }} - {{- toYaml . | nindent 2 }} - {{- end}} -{{- else }} -rules: [] -{{- end}} -{{- end}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/clusterrolebinding.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/clusterrolebinding.yaml deleted file mode 100644 index b848e8c1a8..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/clusterrolebinding.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- if and .Values.rbac.create (or (not .Values.rbac.namespaced) .Values.rbac.extraClusterRoleRules) }} -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: {{ include "grafana.fullname" . }}-clusterrolebinding - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -subjects: - - kind: ServiceAccount - name: {{ include "grafana.serviceAccountName" . }} - namespace: {{ include "grafana.namespace" . }} -roleRef: - kind: ClusterRole - {{- if .Values.rbac.useExistingRole }} - name: {{ .Values.rbac.useExistingRole }} - {{- else }} - name: {{ include "grafana.fullname" . }}-clusterrole - {{- end }} - apiGroup: rbac.authorization.k8s.io -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/configmap-dashboard-provider.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/configmap-dashboard-provider.yaml deleted file mode 100644 index 1f706a8bbf..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/configmap-dashboard-provider.yaml +++ /dev/null @@ -1,29 +0,0 @@ -{{- if and .Values.sidecar.dashboards.enabled .Values.sidecar.dashboards.SCProvider }} -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "grafana.fullname" . }}-config-dashboards - namespace: {{ include "grafana.namespace" . }} -data: - provider.yaml: |- - apiVersion: 1 - providers: - - name: '{{ .Values.sidecar.dashboards.provider.name }}' - orgId: {{ .Values.sidecar.dashboards.provider.orgid }} - {{- if not .Values.sidecar.dashboards.provider.foldersFromFilesStructure }} - folder: '{{ .Values.sidecar.dashboards.provider.folder }}' - {{- end }} - type: {{ .Values.sidecar.dashboards.provider.type }} - disableDeletion: {{ .Values.sidecar.dashboards.provider.disableDelete }} - allowUiUpdates: {{ .Values.sidecar.dashboards.provider.allowUiUpdates }} - updateIntervalSeconds: {{ .Values.sidecar.dashboards.provider.updateIntervalSeconds | default 30 }} - options: - foldersFromFilesStructure: {{ .Values.sidecar.dashboards.provider.foldersFromFilesStructure }} - path: {{ .Values.sidecar.dashboards.folder }}{{- with .Values.sidecar.dashboards.defaultFolderName }}/{{ . }}{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/configmap.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/configmap.yaml deleted file mode 100644 index b5f21e884a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/configmap.yaml +++ /dev/null @@ -1,138 +0,0 @@ -{{- if .Values.createConfigmap }} -{{- $files := .Files }} -{{- $root := . -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -data: - {{- with .Values.plugins }} - plugins: {{ join "," . }} - {{- end }} - grafana.ini: | - {{- range $elem, $elemVal := index .Values "grafana.ini" }} - {{- if not (kindIs "map" $elemVal) }} - {{- if kindIs "invalid" $elemVal }} - {{ $elem }} = - {{- else if kindIs "string" $elemVal }} - {{ $elem }} = {{ tpl $elemVal $ }} - {{- else }} - {{ $elem }} = {{ $elemVal }} - {{- end }} - {{- end }} - {{- end }} - {{- range $key, $value := index .Values "grafana.ini" }} - {{- if kindIs "map" $value }} - [{{ $key }}] - {{- range $elem, $elemVal := $value }} - {{- if kindIs "invalid" $elemVal }} - {{ $elem }} = - {{- else if kindIs "string" $elemVal }} - {{ $elem }} = {{ tpl $elemVal $ }} - {{- else }} - {{ $elem }} = {{ $elemVal }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} - - {{- range $key, $value := .Values.datasources }} - {{- $key | nindent 2 }}: | - {{- tpl (toYaml $value | nindent 4) $root }} - {{- end }} - - {{- range $key, $value := .Values.notifiers }} - {{- $key | nindent 2 }}: | - {{- toYaml $value | nindent 4 }} - {{- end }} - - {{- range $key, $value := .Values.alerting }} - {{- if (hasKey $value "file") }} - {{- $key | nindent 2 }}: - {{- toYaml ( $files.Get $value.file ) | nindent 4}} - {{- else }} - {{- $key | nindent 2 }}: | - {{- tpl (toYaml $value | nindent 4) $root }} - {{- end }} - {{- end }} - - {{- range $key, $value := .Values.dashboardProviders }} - {{- $key | nindent 2 }}: | - {{- toYaml $value | nindent 4 }} - {{- end }} - -{{- if .Values.dashboards }} - download_dashboards.sh: | - #!/usr/bin/env sh - set -euf - {{- if .Values.dashboardProviders }} - {{- range $key, $value := .Values.dashboardProviders }} - {{- range $value.providers }} - mkdir -p {{ .options.path }} - {{- end }} - {{- end }} - {{- end }} - {{ $dashboardProviders := .Values.dashboardProviders }} - {{- range $provider, $dashboards := .Values.dashboards }} - {{- range $key, $value := $dashboards }} - {{- if (or (hasKey $value "gnetId") (hasKey $value "url")) }} - curl -skf \ - --connect-timeout 60 \ - --max-time 60 \ - {{- if not $value.b64content }} - {{- if not $value.acceptHeader }} - -H "Accept: application/json" \ - {{- else }} - -H "Accept: {{ $value.acceptHeader }}" \ - {{- end }} - {{- if $value.token }} - -H "Authorization: token {{ $value.token }}" \ - {{- end }} - {{- if $value.bearerToken }} - -H "Authorization: Bearer {{ $value.bearerToken }}" \ - {{- end }} - {{- if $value.basic }} - -H "Authorization: Basic {{ $value.basic }}" \ - {{- end }} - {{- if $value.gitlabToken }} - -H "PRIVATE-TOKEN: {{ $value.gitlabToken }}" \ - {{- end }} - -H "Content-Type: application/json;charset=UTF-8" \ - {{- end }} - {{- $dpPath := "" -}} - {{- range $kd := (index $dashboardProviders "dashboardproviders.yaml").providers }} - {{- if eq $kd.name $provider }} - {{- $dpPath = $kd.options.path }} - {{- end }} - {{- end }} - {{- if $value.url }} - "{{ $value.url }}" \ - {{- else }} - "https://grafana.com/api/dashboards/{{ $value.gnetId }}/revisions/{{- if $value.revision -}}{{ $value.revision }}{{- else -}}1{{- end -}}/download" \ - {{- end }} - {{- if $value.datasource }} - {{- if kindIs "string" $value.datasource }} - | sed '/-- .* --/! s/"datasource":.*,/"datasource": "{{ $value.datasource }}",/g' \ - {{- end }} - {{- if kindIs "slice" $value.datasource }} - {{- range $value.datasource }} - | sed '/-- .* --/! s/${{"{"}}{{ .name }}}/{{ .value }}/g' \ - {{- end }} - {{- end }} - {{- end }} - {{- if $value.b64content }} - | base64 -d \ - {{- end }} - > "{{- if $dpPath -}}{{ $dpPath }}{{- else -}}/var/lib/grafana/dashboards/{{ $provider }}{{- end -}}/{{ $key }}.json" - {{ end }} - {{- end }} - {{- end }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/dashboards-json-configmap.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/dashboards-json-configmap.yaml deleted file mode 100644 index df0ed0d8c5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/dashboards-json-configmap.yaml +++ /dev/null @@ -1,35 +0,0 @@ -{{- if .Values.dashboards }} -{{ $files := .Files }} -{{- range $provider, $dashboards := .Values.dashboards }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "grafana.fullname" $ }}-dashboards-{{ $provider }} - namespace: {{ include "grafana.namespace" $ }} - labels: - {{- include "grafana.labels" $ | nindent 4 }} - dashboard-provider: {{ $provider }} -{{- if $dashboards }} -data: -{{- $dashboardFound := false }} -{{- range $key, $value := $dashboards }} -{{- if (or (hasKey $value "json") (hasKey $value "file")) }} -{{- $dashboardFound = true }} - {{- print $key | nindent 2 }}.json: - {{- if hasKey $value "json" }} - |- - {{- $value.json | nindent 6 }} - {{- end }} - {{- if hasKey $value "file" }} - {{- toYaml ( $files.Get $value.file ) | nindent 4}} - {{- end }} -{{- end }} -{{- end }} -{{- if not $dashboardFound }} - {} -{{- end }} -{{- end }} ---- -{{- end }} - -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/deployment.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/deployment.yaml deleted file mode 100644 index bfa26bb40e..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/deployment.yaml +++ /dev/null @@ -1,51 +0,0 @@ -{{- if (and (not .Values.useStatefulSet) (or (not .Values.persistence.enabled) (eq .Values.persistence.type "pvc"))) }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if and (not .Values.autoscaling.enabled) (.Values.replicas) }} - replicas: {{ .Values.replicas }} - {{- end }} - revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} - selector: - matchLabels: - {{- include "grafana.selectorLabels" . | nindent 6 }} - {{- with .Values.deploymentStrategy }} - strategy: - {{- toYaml . | trim | nindent 4 }} - {{- end }} - template: - metadata: - labels: - {{- include "grafana.selectorLabels" . | nindent 8 }} - {{- with .Values.podLabels }} - {{- toYaml . | nindent 8 }} - {{- end }} - annotations: - checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} - checksum/dashboards-json-config: {{ include (print $.Template.BasePath "/dashboards-json-configmap.yaml") . | sha256sum }} - checksum/sc-dashboard-provider-config: {{ include (print $.Template.BasePath "/configmap-dashboard-provider.yaml") . | sha256sum }} - {{- if and (or (and (not .Values.admin.existingSecret) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD)) (and .Values.ldap.enabled (not .Values.ldap.existingSecret))) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - checksum/secret: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }} - {{- end }} - {{- if .Values.envRenderSecret }} - checksum/secret-env: {{ include (print $.Template.BasePath "/secret-env.yaml") . | sha256sum }} - {{- end }} - kubectl.kubernetes.io/default-container: {{ .Chart.Name }} - {{- with .Values.podAnnotations }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- include "grafana.pod" . | nindent 6 }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/extra-manifests.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/extra-manifests.yaml deleted file mode 100644 index a9bb3b6ba8..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/extra-manifests.yaml +++ /dev/null @@ -1,4 +0,0 @@ -{{ range .Values.extraObjects }} ---- -{{ tpl (toYaml .) $ }} -{{ end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/headless-service.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/headless-service.yaml deleted file mode 100644 index 3028589d32..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/headless-service.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- $sts := list "sts" "StatefulSet" "statefulset" -}} -{{- if or .Values.headlessService (and .Values.persistence.enabled (not .Values.persistence.existingClaim) (has .Values.persistence.type $sts)) }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "grafana.fullname" . }}-headless - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - clusterIP: None - selector: - {{- include "grafana.selectorLabels" . | nindent 4 }} - type: ClusterIP - ports: - - name: {{ .Values.gossipPortName }}-tcp - port: 9094 -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/hpa.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/hpa.yaml deleted file mode 100644 index 46bbcb49a2..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/hpa.yaml +++ /dev/null @@ -1,52 +0,0 @@ -{{- $sts := list "sts" "StatefulSet" "statefulset" -}} -{{- if .Values.autoscaling.enabled }} -apiVersion: {{ include "grafana.hpa.apiVersion" . }} -kind: HorizontalPodAutoscaler -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - app.kubernetes.io/name: {{ include "grafana.name" . }} - helm.sh/chart: {{ include "grafana.chart" . }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} -spec: - scaleTargetRef: - apiVersion: apps/v1 - {{- if has .Values.persistence.type $sts }} - kind: StatefulSet - {{- else }} - kind: Deployment - {{- end }} - name: {{ include "grafana.fullname" . }} - minReplicas: {{ .Values.autoscaling.minReplicas }} - maxReplicas: {{ .Values.autoscaling.maxReplicas }} - metrics: - {{- if .Values.autoscaling.targetMemory }} - - type: Resource - resource: - name: memory - {{- if eq (include "grafana.hpa.apiVersion" .) "autoscaling/v2beta1" }} - targetAverageUtilization: {{ .Values.autoscaling.targetMemory }} - {{- else }} - target: - type: Utilization - averageUtilization: {{ .Values.autoscaling.targetMemory }} - {{- end }} - {{- end }} - {{- if .Values.autoscaling.targetCPU }} - - type: Resource - resource: - name: cpu - {{- if eq (include "grafana.hpa.apiVersion" .) "autoscaling/v2beta1" }} - targetAverageUtilization: {{ .Values.autoscaling.targetCPU }} - {{- else }} - target: - type: Utilization - averageUtilization: {{ .Values.autoscaling.targetCPU }} - {{- end }} - {{- end }} - {{- if .Values.autoscaling.behavior }} - behavior: {{ toYaml .Values.autoscaling.behavior | nindent 4 }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-deployment.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-deployment.yaml deleted file mode 100644 index ebad9ca3b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-deployment.yaml +++ /dev/null @@ -1,130 +0,0 @@ -{{ if .Values.imageRenderer.enabled }} -{{- $root := . -}} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "grafana.fullname" . }}-image-renderer - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.imageRenderer.labels" . | nindent 4 }} - {{- with .Values.imageRenderer.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.imageRenderer.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if and (not .Values.imageRenderer.autoscaling.enabled) (.Values.imageRenderer.replicas) }} - replicas: {{ .Values.imageRenderer.replicas }} - {{- end }} - revisionHistoryLimit: {{ .Values.imageRenderer.revisionHistoryLimit }} - selector: - matchLabels: - {{- include "grafana.imageRenderer.selectorLabels" . | nindent 6 }} - - {{- with .Values.imageRenderer.deploymentStrategy }} - strategy: - {{- toYaml . | trim | nindent 4 }} - {{- end }} - template: - metadata: - labels: - {{- include "grafana.imageRenderer.selectorLabels" . | nindent 8 }} - {{- with .Values.imageRenderer.podLabels }} - {{- toYaml . | nindent 8 }} - {{- end }} - annotations: - checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} - {{- with .Values.imageRenderer.podAnnotations }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- with .Values.imageRenderer.schedulerName }} - schedulerName: "{{ . }}" - {{- end }} - {{- with .Values.imageRenderer.serviceAccountName }} - serviceAccountName: "{{ . }}" - {{- end }} - {{- with .Values.imageRenderer.securityContext }} - securityContext: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.imageRenderer.hostAliases }} - hostAliases: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.imageRenderer.priorityClassName }} - priorityClassName: {{ . }} - {{- end }} - {{- with .Values.imageRenderer.image.pullSecrets }} - imagePullSecrets: - {{- range . }} - - name: {{ tpl . $root }} - {{- end}} - {{- end }} - containers: - - name: {{ .Chart.Name }}-image-renderer - {{- if .Values.imageRenderer.image.sha }} - image: "{{ template "system_default_registry" . }}{{ .Values.imageRenderer.image.repository }}:{{ .Values.imageRenderer.image.tag }}@sha256:{{ .Values.imageRenderer.image.sha }}" - {{- else }} - image: "{{ template "system_default_registry" . }}{{ .Values.imageRenderer.image.repository }}:{{ .Values.imageRenderer.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.imageRenderer.image.pullPolicy }} - {{- if .Values.imageRenderer.command }} - command: - {{- range .Values.imageRenderer.command }} - - {{ . }} - {{- end }} - {{- end}} - ports: - - name: {{ .Values.imageRenderer.service.portName }} - containerPort: {{ .Values.imageRenderer.service.targetPort }} - protocol: TCP - livenessProbe: - httpGet: - path: / - port: {{ .Values.imageRenderer.service.portName }} - env: - - name: HTTP_PORT - value: {{ .Values.imageRenderer.service.targetPort | quote }} - {{- if .Values.imageRenderer.serviceMonitor.enabled }} - - name: ENABLE_METRICS - value: "true" - {{- end }} - {{- range $key, $value := .Values.imageRenderer.envValueFrom }} - - name: {{ $key | quote }} - valueFrom: - {{- tpl (toYaml $value) $ | nindent 16 }} - {{- end }} - {{- range $key, $value := .Values.imageRenderer.env }} - - name: {{ $key | quote }} - value: {{ $value | quote }} - {{- end }} - {{- with .Values.imageRenderer.containerSecurityContext }} - securityContext: - {{- toYaml . | nindent 12 }} - {{- end }} - volumeMounts: - - mountPath: /tmp - name: image-renderer-tmpfs - {{- with .Values.imageRenderer.resources }} - resources: - {{- toYaml . | nindent 12 }} - {{- end }} - {{- with .Values.imageRenderer.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.imageRenderer.affinity }} - affinity: - {{- tpl (toYaml .) $root | nindent 8 }} - {{- end }} - {{- with .Values.imageRenderer.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - volumes: - - name: image-renderer-tmpfs - emptyDir: {} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-hpa.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-hpa.yaml deleted file mode 100644 index b0f0059b79..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-hpa.yaml +++ /dev/null @@ -1,47 +0,0 @@ -{{- if and .Values.imageRenderer.enabled .Values.imageRenderer.autoscaling.enabled }} -apiVersion: {{ include "grafana.hpa.apiVersion" . }} -kind: HorizontalPodAutoscaler -metadata: - name: {{ include "grafana.fullname" . }}-image-renderer - namespace: {{ include "grafana.namespace" . }} - labels: - app.kubernetes.io/name: {{ include "grafana.name" . }}-image-renderer - helm.sh/chart: {{ include "grafana.chart" . }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: {{ include "grafana.fullname" . }}-image-renderer - minReplicas: {{ .Values.imageRenderer.autoscaling.minReplicas }} - maxReplicas: {{ .Values.imageRenderer.autoscaling.maxReplicas }} - metrics: - {{- if .Values.imageRenderer.autoscaling.targetMemory }} - - type: Resource - resource: - name: memory - {{- if eq (include "grafana.hpa.apiVersion" .) "autoscaling/v2beta1" }} - targetAverageUtilization: {{ .Values.imageRenderer.autoscaling.targetMemory }} - {{- else }} - target: - type: Utilization - averageUtilization: {{ .Values.imageRenderer.autoscaling.targetMemory }} - {{- end }} - {{- end }} - {{- if .Values.imageRenderer.autoscaling.targetCPU }} - - type: Resource - resource: - name: cpu - {{- if eq (include "grafana.hpa.apiVersion" .) "autoscaling/v2beta1" }} - targetAverageUtilization: {{ .Values.imageRenderer.autoscaling.targetCPU }} - {{- else }} - target: - type: Utilization - averageUtilization: {{ .Values.imageRenderer.autoscaling.targetCPU }} - {{- end }} - {{- end }} - {{- if .Values.imageRenderer.autoscaling.behavior }} - behavior: {{ toYaml .Values.imageRenderer.autoscaling.behavior | nindent 4 }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-network-policy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-network-policy.yaml deleted file mode 100644 index d1a0eb313d..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-network-policy.yaml +++ /dev/null @@ -1,79 +0,0 @@ -{{- if and .Values.imageRenderer.enabled .Values.imageRenderer.networkPolicy.limitIngress }} ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: {{ include "grafana.fullname" . }}-image-renderer-ingress - namespace: {{ include "grafana.namespace" . }} - annotations: - comment: Limit image-renderer ingress traffic from grafana -spec: - podSelector: - matchLabels: - {{- include "grafana.imageRenderer.selectorLabels" . | nindent 6 }} - {{- with .Values.imageRenderer.podLabels }} - {{- toYaml . | nindent 6 }} - {{- end }} - - policyTypes: - - Ingress - ingress: - - ports: - - port: {{ .Values.imageRenderer.service.targetPort }} - protocol: TCP - from: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: {{ include "grafana.namespace" . }} - podSelector: - matchLabels: - {{- include "grafana.selectorLabels" . | nindent 14 }} - {{- with .Values.podLabels }} - {{- toYaml . | nindent 14 }} - {{- end }} - {{- with .Values.imageRenderer.networkPolicy.extraIngressSelectors -}} - {{ toYaml . | nindent 8 }} - {{- end }} -{{- end }} - -{{- if and .Values.imageRenderer.enabled .Values.imageRenderer.networkPolicy.limitEgress }} ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: {{ include "grafana.fullname" . }}-image-renderer-egress - namespace: {{ include "grafana.namespace" . }} - annotations: - comment: Limit image-renderer egress traffic to grafana -spec: - podSelector: - matchLabels: - {{- include "grafana.imageRenderer.selectorLabels" . | nindent 6 }} - {{- with .Values.imageRenderer.podLabels }} - {{- toYaml . | nindent 6 }} - {{- end }} - - policyTypes: - - Egress - egress: - # allow dns resolution - - ports: - - port: 53 - protocol: UDP - - port: 53 - protocol: TCP - # talk only to grafana - - ports: - - port: {{ .Values.service.targetPort }} - protocol: TCP - to: - - namespaceSelector: - matchLabels: - name: {{ include "grafana.namespace" . }} - podSelector: - matchLabels: - {{- include "grafana.selectorLabels" . | nindent 14 }} - {{- with .Values.podLabels }} - {{- toYaml . | nindent 14 }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-service.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-service.yaml deleted file mode 100644 index f8da127cf8..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-service.yaml +++ /dev/null @@ -1,31 +0,0 @@ -{{- if and .Values.imageRenderer.enabled .Values.imageRenderer.service.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "grafana.fullname" . }}-image-renderer - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.imageRenderer.labels" . | nindent 4 }} - {{- with .Values.imageRenderer.service.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.imageRenderer.service.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - type: ClusterIP - {{- with .Values.imageRenderer.service.clusterIP }} - clusterIP: {{ . }} - {{- end }} - ports: - - name: {{ .Values.imageRenderer.service.portName }} - port: {{ .Values.imageRenderer.service.port }} - protocol: TCP - targetPort: {{ .Values.imageRenderer.service.targetPort }} - {{- with .Values.imageRenderer.appProtocol }} - appProtocol: {{ . }} - {{- end }} - selector: - {{- include "grafana.imageRenderer.selectorLabels" . | nindent 4 }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-servicemonitor.yaml deleted file mode 100644 index 5d9f09d266..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/image-renderer-servicemonitor.yaml +++ /dev/null @@ -1,48 +0,0 @@ -{{- if .Values.imageRenderer.serviceMonitor.enabled }} ---- -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "grafana.fullname" . }}-image-renderer - {{- if .Values.imageRenderer.serviceMonitor.namespace }} - namespace: {{ tpl .Values.imageRenderer.serviceMonitor.namespace . }} - {{- else }} - namespace: {{ include "grafana.namespace" . }} - {{- end }} - labels: - {{- include "grafana.imageRenderer.labels" . | nindent 4 }} - {{- with .Values.imageRenderer.serviceMonitor.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - endpoints: - - port: {{ .Values.imageRenderer.service.portName }} - {{- with .Values.imageRenderer.serviceMonitor.interval }} - interval: {{ . }} - {{- end }} - {{- with .Values.imageRenderer.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ . }} - {{- end }} - honorLabels: true - path: {{ .Values.imageRenderer.serviceMonitor.path }} - scheme: {{ .Values.imageRenderer.serviceMonitor.scheme }} - {{- with .Values.imageRenderer.serviceMonitor.tlsConfig }} - tlsConfig: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.imageRenderer.serviceMonitor.relabelings }} - relabelings: - {{- toYaml . | nindent 6 }} - {{- end }} - jobLabel: "{{ .Release.Name }}-image-renderer" - selector: - matchLabels: - {{- include "grafana.imageRenderer.selectorLabels" . | nindent 6 }} - namespaceSelector: - matchNames: - - {{ include "grafana.namespace" . }} - {{- with .Values.imageRenderer.serviceMonitor.targetLabels }} - targetLabels: - {{- toYaml . | nindent 4 }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/ingress.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/ingress.yaml deleted file mode 100644 index 063cdfaa52..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/ingress.yaml +++ /dev/null @@ -1,78 +0,0 @@ -{{- if .Values.ingress.enabled -}} -{{- $ingressApiIsStable := eq (include "grafana.ingress.isStable" .) "true" -}} -{{- $ingressSupportsIngressClassName := eq (include "grafana.ingress.supportsIngressClassName" .) "true" -}} -{{- $ingressSupportsPathType := eq (include "grafana.ingress.supportsPathType" .) "true" -}} -{{- $fullName := include "grafana.fullname" . -}} -{{- $servicePort := .Values.service.port -}} -{{- $ingressPath := .Values.ingress.path -}} -{{- $ingressPathType := .Values.ingress.pathType -}} -{{- $extraPaths := .Values.ingress.extraPaths -}} -apiVersion: {{ include "grafana.ingress.apiVersion" . }} -kind: Ingress -metadata: - name: {{ $fullName }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.ingress.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.ingress.annotations }} - annotations: - {{- range $key, $value := . }} - {{ $key }}: {{ tpl $value $ | quote }} - {{- end }} - {{- end }} -spec: - {{- if and $ingressSupportsIngressClassName .Values.ingress.ingressClassName }} - ingressClassName: {{ .Values.ingress.ingressClassName }} - {{- end -}} - {{- with .Values.ingress.tls }} - tls: - {{- tpl (toYaml .) $ | nindent 4 }} - {{- end }} - rules: - {{- if .Values.ingress.hosts }} - {{- range .Values.ingress.hosts }} - - host: {{ tpl . $ }} - http: - paths: - {{- with $extraPaths }} - {{- toYaml . | nindent 10 }} - {{- end }} - - path: {{ $ingressPath }} - {{- if $ingressSupportsPathType }} - pathType: {{ $ingressPathType }} - {{- end }} - backend: - {{- if $ingressApiIsStable }} - service: - name: {{ $fullName }} - port: - number: {{ $servicePort }} - {{- else }} - serviceName: {{ $fullName }} - servicePort: {{ $servicePort }} - {{- end }} - {{- end }} - {{- else }} - - http: - paths: - - backend: - {{- if $ingressApiIsStable }} - service: - name: {{ $fullName }} - port: - number: {{ $servicePort }} - {{- else }} - serviceName: {{ $fullName }} - servicePort: {{ $servicePort }} - {{- end }} - {{- with $ingressPath }} - path: {{ . }} - {{- end }} - {{- if $ingressSupportsPathType }} - pathType: {{ $ingressPathType }} - {{- end }} - {{- end -}} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/networkpolicy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/networkpolicy.yaml deleted file mode 100644 index ea4578bec2..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/networkpolicy.yaml +++ /dev/null @@ -1,52 +0,0 @@ -{{- if .Values.networkPolicy.enabled }} -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - policyTypes: - {{- if .Values.networkPolicy.ingress }} - - Ingress - {{- end }} - {{- if .Values.networkPolicy.egress.enabled }} - - Egress - {{- end }} - podSelector: - matchLabels: - {{- include "grafana.selectorLabels" . | nindent 6 }} - - {{- if .Values.networkPolicy.egress.enabled }} - egress: - - ports: - {{ .Values.networkPolicy.egress.ports | toJson }} - {{- end }} - {{- if .Values.networkPolicy.ingress }} - ingress: - - ports: - - port: {{ .Values.service.targetPort }} - {{- if not .Values.networkPolicy.allowExternal }} - from: - - podSelector: - matchLabels: - {{ include "grafana.fullname" . }}-client: "true" - {{- with .Values.networkPolicy.explicitNamespacesSelector }} - - namespaceSelector: - {{- toYaml . | nindent 12 }} - {{- end }} - - podSelector: - matchLabels: - {{- include "grafana.labels" . | nindent 14 }} - role: read - {{- end }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/nginx-config.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/nginx-config.yaml deleted file mode 100644 index 557471f6ff..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/nginx-config.yaml +++ /dev/null @@ -1,94 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: grafana-nginx-proxy-config - namespace: {{ template "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} -data: - nginx.conf: |- - worker_processes auto; - error_log /dev/stdout warn; - pid /var/cache/nginx/nginx.pid; - - events { - worker_connections 1024; - } - - http { - include /etc/nginx/mime.types; - log_format main '[$time_local - $status] $remote_addr - $remote_user $request ($http_referer)'; - - proxy_connect_timeout 10; - proxy_read_timeout 180; - proxy_send_timeout 5; - proxy_buffering off; - proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=my_zone:100m inactive=1d max_size=10g; - - map $http_upgrade $connection_upgrade { - default upgrade; - '' close; - } - - server { - listen 8080; - access_log off; - - gzip on; - gzip_min_length 1k; - gzip_comp_level 2; - gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript image/jpeg image/gif image/png; - gzip_vary on; - gzip_disable "MSIE [1-6]\."; - - proxy_set_header Host $host; - - location /api/dashboards { - proxy_pass http://localhost:3000; - } - - location /api/search { - proxy_pass http://localhost:3000; - - sub_filter_types application/json; - sub_filter_once off; - } - - location /api/live/ { - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - proxy_set_header Host $http_host; - proxy_pass http://localhost:3000; - } - - location / { - proxy_cache my_zone; - proxy_cache_valid 200 302 1d; - proxy_cache_valid 301 30d; - proxy_cache_valid any 5m; - proxy_cache_bypass $http_cache_control; - add_header X-Proxy-Cache $upstream_cache_status; - add_header Cache-Control "public"; - - proxy_pass http://localhost:3000/; - - sub_filter_once off; - - {{- if eq .Values.global.cattle.clusterId "local" -}} - sub_filter '"appSubUrl":""' '"appSubUrl":"/api/v1/namespaces/{{ template "grafana.namespace" . }}/services/http:{{ template "grafana.fullname" . }}:{{ .Values.service.port }}/proxy"'; - {{- else -}} - sub_filter '"appSubUrl":""' '"appSubUrl":"/k8s/clusters/{{ .Values.global.cattle.clusterId }}/api/v1/namespaces/{{ template "grafana.namespace" . }}/services/http:{{ template "grafana.fullname" . }}:{{ .Values.service.port }}/proxy"'; - {{- end -}} - - sub_filter ':"/avatar/' ':"avatar/'; - - if ($request_filename ~ .*\.(?:js|css|jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm)$) { - expires 90d; - } - - rewrite ^/k8s/clusters/.*/proxy(.*) /$1 break; - - } - } - } diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/poddisruptionbudget.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/poddisruptionbudget.yaml deleted file mode 100644 index 05251214ac..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/poddisruptionbudget.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- if .Values.podDisruptionBudget }} -apiVersion: {{ include "grafana.podDisruptionBudget.apiVersion" . }} -kind: PodDisruptionBudget -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- with .Values.podDisruptionBudget.minAvailable }} - minAvailable: {{ . }} - {{- end }} - {{- with .Values.podDisruptionBudget.maxUnavailable }} - maxUnavailable: {{ . }} - {{- end }} - selector: - matchLabels: - {{- include "grafana.selectorLabels" . | nindent 6 }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/podsecuritypolicy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/podsecuritypolicy.yaml deleted file mode 100644 index 973caccd57..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/podsecuritypolicy.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- if and (or .Values.global.cattle.psp.enabled .Values.rbac.pspEnabled) (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ include "grafana.fullname" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} -{{- if .Values.rbac.pspAnnotations }} - annotations: {{ toYaml .Values.rbac.pspAnnotations | nindent 4 }} -{{- end }} -spec: - privileged: false - allowPrivilegeEscalation: false - requiredDropCapabilities: - # Default set from Docker, with DAC_OVERRIDE and CHOWN - - ALL - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'csi' - - 'secret' - - 'downwardAPI' - - 'persistentVolumeClaim' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - readOnlyRootFilesystem: false -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/pvc.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/pvc.yaml deleted file mode 100644 index ef2c883a9d..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/pvc.yaml +++ /dev/null @@ -1,38 +0,0 @@ -{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) (eq .Values.persistence.type "pvc")}} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.persistence.extraPvcLabels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.persistence.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.persistence.finalizers }} - finalizers: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - accessModes: -{{- $_ := required "Must provide at least one access mode for persistent volumes used by Grafana" .Values.persistence.accessModes }} -{{- $_ := required "Must provide at least one access mode for persistent volumes used by Grafana" (first .Values.persistence.accessModes) }} - {{- range .Values.persistence.accessModes }} - - {{ . | quote }} - {{- end }} - resources: - requests: - storage: {{ .Values.persistence.size | quote }} - {{- with .Values.persistence.storageClassName }} - storageClassName: {{ . }} - {{- end }} - {{- with .Values.persistence.selectorLabels }} - selector: - matchLabels: - {{- toYaml . | nindent 6 }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/role.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/role.yaml deleted file mode 100644 index 9696215240..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/role.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if and .Values.rbac.create (not .Values.rbac.useExistingRole) -}} -apiVersion: {{ include "grafana.rbac.apiVersion" . }} -kind: Role -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -{{- if or (or .Values.global.cattle.psp.enabled .Values.rbac.pspEnabled) (and .Values.rbac.namespaced (or .Values.sidecar.dashboards.enabled .Values.sidecar.datasources.enabled .Values.sidecar.plugins.enabled .Values.rbac.extraRoleRules)) }} -rules: - {{- if and (or .Values.global.cattle.psp.enabled .Values.rbac.pspEnabled) (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} - - apiGroups: ['extensions'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: [{{ include "grafana.fullname" . }}] - {{- end }} - {{- if and .Values.rbac.namespaced (or .Values.sidecar.dashboards.enabled .Values.sidecar.datasources.enabled .Values.sidecar.plugins.enabled) }} - - apiGroups: [""] # "" indicates the core API group - resources: ["configmaps", "secrets"] - verbs: ["get", "watch", "list"] - {{- end }} - {{- with .Values.rbac.extraRoleRules }} - {{- toYaml . | nindent 2 }} - {{- end}} -{{- else }} -rules: [] -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/rolebinding.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/rolebinding.yaml deleted file mode 100644 index cc07bd9a0f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/rolebinding.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.rbac.create }} -apiVersion: {{ include "grafana.rbac.apiVersion" . }} -kind: RoleBinding -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - {{- if .Values.rbac.useExistingRole }} - name: {{ .Values.rbac.useExistingRole }} - {{- else }} - name: {{ include "grafana.fullname" . }} - {{- end }} -subjects: -- kind: ServiceAccount - name: {{ include "grafana.serviceAccountName" . }} - namespace: {{ include "grafana.namespace" . }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/secret-env.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/secret-env.yaml deleted file mode 100644 index eb14aac707..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/secret-env.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if .Values.envRenderSecret }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "grafana.fullname" . }}-env - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} -type: Opaque -data: -{{- range $key, $val := .Values.envRenderSecret }} - {{ $key }}: {{ tpl ($val | toString) $ | b64enc | quote }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/secret.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/secret.yaml deleted file mode 100644 index 5cbd527448..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/secret.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{- if or (and (not .Values.admin.existingSecret) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION)) (and .Values.ldap.enabled (not .Values.ldap.existingSecret)) }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -type: Opaque -data: - {{- if and (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) (not .Values.admin.existingSecret) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) }} - admin-user: {{ .Values.adminUser | b64enc | quote }} - {{- if .Values.adminPassword }} - admin-password: {{ .Values.adminPassword | b64enc | quote }} - {{- else }} - admin-password: {{ include "grafana.password" . }} - {{- end }} - {{- end }} - {{- if not .Values.ldap.existingSecret }} - ldap-toml: {{ tpl .Values.ldap.config $ | b64enc | quote }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/service.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/service.yaml deleted file mode 100644 index 43d360b5ea..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/service.yaml +++ /dev/null @@ -1,55 +0,0 @@ -{{- if .Values.service.enabled }} -{{- $root := . }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.service.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.service.annotations }} - annotations: - {{- tpl (toYaml . | nindent 4) $root }} - {{- end }} -spec: - {{- if (or (eq .Values.service.type "ClusterIP") (empty .Values.service.type)) }} - type: ClusterIP - {{- with .Values.service.clusterIP }} - clusterIP: {{ . }} - {{- end }} - {{- else if eq .Values.service.type "LoadBalancer" }} - type: {{ .Values.service.type }} - {{- with .Values.service.loadBalancerIP }} - loadBalancerIP: {{ . }} - {{- end }} - {{- with .Values.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- toYaml . | nindent 4 }} - {{- end }} - {{- else }} - type: {{ .Values.service.type }} - {{- end }} - {{- with .Values.service.externalIPs }} - externalIPs: - {{- toYaml . | nindent 4 }} - {{- end }} - ports: - - name: {{ .Values.service.portName }} - port: {{ .Values.service.port }} - protocol: TCP - targetPort: {{ .Values.service.targetPort }} - {{- with .Values.service.appProtocol }} - appProtocol: {{ . }} - {{- end }} - {{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort))) }} - nodePort: {{ .Values.service.nodePort }} - {{- end }} - {{- with .Values.extraExposePorts }} - {{- tpl (toYaml . | nindent 4) $root }} - {{- end }} - selector: - {{- include "grafana.selectorLabels" . | nindent 4 }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/serviceaccount.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/serviceaccount.yaml deleted file mode 100644 index 784e71ba67..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/serviceaccount.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if .Values.serviceAccount.create }} -{{- $root := . -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.serviceAccount.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{- tpl (toYaml . | nindent 4) $root }} - {{- end }} - name: {{ include "grafana.serviceAccountName" . }} - namespace: {{ include "grafana.namespace" . }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/servicemonitor.yaml deleted file mode 100644 index 72d4266139..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/servicemonitor.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- if .Values.serviceMonitor.enabled }} ---- -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "grafana.fullname" . }} - {{- if .Values.serviceMonitor.namespace }} - namespace: {{ tpl .Values.serviceMonitor.namespace . }} - {{- else }} - namespace: {{ include "grafana.namespace" . }} - {{- end }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.serviceMonitor.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - endpoints: - - port: {{ .Values.service.portName }} - {{- with .Values.serviceMonitor.interval }} - interval: {{ . }} - {{- end }} - {{- with .Values.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ . }} - {{- end }} - honorLabels: true - path: {{ .Values.serviceMonitor.path }} - scheme: {{ .Values.serviceMonitor.scheme }} - {{- with .Values.serviceMonitor.tlsConfig }} - tlsConfig: - {{- toYaml . | nindent 6 }} - {{- end }} - metricRelabelings: - {{- if .Values.serviceMonitor.metricRelabelings }} - {{- toYaml .Values.serviceMonitor.metricRelabelings | nindent 6 }} - {{- end }} - {{ if .Values.global.cattle.clusterId }} - - sourceLabels: [__address__] - targetLabel: cluster_id - replacement: {{ .Values.global.cattle.clusterId }} - {{- end }} - {{ if .Values.global.cattle.clusterName }} - - sourceLabels: [__address__] - targetLabel: cluster_name - replacement: {{ .Values.global.cattle.clusterName }} - {{- end }} - {{- if .Values.serviceMonitor.relabelings }} - {{- with .Values.serviceMonitor.relabelings }} - relabelings: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- end }} - {{- with .Values.serviceMonitor.metricRelabelings }} - metricRelabelings: - {{- toYaml . | nindent 6 }} - {{- end }} - jobLabel: "{{ .Release.Name }}" - selector: - matchLabels: - {{- include "grafana.selectorLabels" . | nindent 6 }} - namespaceSelector: - matchNames: - - {{ include "grafana.namespace" . }} - {{- with .Values.serviceMonitor.targetLabels }} - targetLabels: - {{- toYaml . | nindent 4 }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/statefulset.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/statefulset.yaml deleted file mode 100644 index 49278083e8..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/statefulset.yaml +++ /dev/null @@ -1,58 +0,0 @@ -{{- $sts := list "sts" "StatefulSet" "statefulset" -}} -{{- if (or (.Values.useStatefulSet) (and .Values.persistence.enabled (not .Values.persistence.existingClaim) (has .Values.persistence.type $sts)))}} -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.replicas }} - selector: - matchLabels: - {{- include "grafana.selectorLabels" . | nindent 6 }} - serviceName: {{ include "grafana.fullname" . }}-headless - template: - metadata: - labels: - {{- include "grafana.selectorLabels" . | nindent 8 }} - {{- with .Values.podLabels }} - {{- toYaml . | nindent 8 }} - {{- end }} - annotations: - checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} - checksum/dashboards-json-config: {{ include (print $.Template.BasePath "/dashboards-json-configmap.yaml") . | sha256sum }} - checksum/sc-dashboard-provider-config: {{ include (print $.Template.BasePath "/configmap-dashboard-provider.yaml") . | sha256sum }} - {{- if and (or (and (not .Values.admin.existingSecret) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD)) (and .Values.ldap.enabled (not .Values.ldap.existingSecret))) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - checksum/secret: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }} - {{- end }} - kubectl.kubernetes.io/default-container: {{ .Chart.Name }} - {{- with .Values.podAnnotations }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- include "grafana.pod" . | nindent 6 }} - {{- if .Values.persistence.enabled}} - volumeClaimTemplates: - - metadata: - name: storage - spec: -{{- $_ := required "Must provide at least one access mode for persistent volumes used by Grafana" .Values.persistence.accessModes }} -{{- $_ := required "Must provide at least one access mode for persistent volumes used by Grafana" (first .Values.persistence.accessModes) }} - accessModes: {{ .Values.persistence.accessModes }} - storageClassName: {{ .Values.persistence.storageClassName }} - resources: - requests: - storage: {{ required "Must provide size for persistent volumes used by Grafana" .Values.persistence.size }} - {{- with .Values.persistence.selectorLabels }} - selector: - matchLabels: - {{- toYaml . | nindent 10 }} - {{- end }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-configmap.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-configmap.yaml deleted file mode 100644 index 4eec1b6ab2..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-configmap.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.testFramework.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "grafana.fullname" . }}-test - namespace: {{ include "grafana.namespace" . }} - annotations: - "helm.sh/hook": test-success - "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" - labels: - {{- include "grafana.labels" . | nindent 4 }} -data: - run.sh: |- - @test "Test Health" { - url="http://{{ include "grafana.fullname" . }}/api/health" - - code=$(wget --server-response --spider --timeout 10 --tries 1 ${url} 2>&1 | awk '/^ HTTP/{print $2}') - [ "$code" == "200" ] - } -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-podsecuritypolicy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-podsecuritypolicy.yaml deleted file mode 100644 index 70a0a884c9..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-podsecuritypolicy.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if and (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") .Values.testFramework.enabled (or .Values.global.cattle.psp.enabled .Values.rbac.pspEnabled) }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ include "grafana.fullname" . }}-test - annotations: - "helm.sh/hook": test-success - "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" - labels: - {{- include "grafana.labels" . | nindent 4 }} -spec: - allowPrivilegeEscalation: true - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - fsGroup: - rule: RunAsAny - seLinux: - rule: RunAsAny - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - volumes: - - configMap - - downwardAPI - - emptyDir - - projected - - csi - - secret -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-role.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-role.yaml deleted file mode 100644 index 976418b137..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-role.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if and (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") .Values.testFramework.enabled (or .Values.global.cattle.psp.enabled .Values.rbac.pspEnabled) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ include "grafana.fullname" . }}-test - namespace: {{ include "grafana.namespace" . }} - annotations: - "helm.sh/hook": test-success - "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" - labels: - {{- include "grafana.labels" . | nindent 4 }} -rules: - - apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: [{{ include "grafana.fullname" . }}-test] -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-rolebinding.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-rolebinding.yaml deleted file mode 100644 index 509566eccd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-rolebinding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if and (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") .Values.testFramework.enabled (or .Values.global.cattle.psp.enabled .Values.rbac.pspEnabled) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ include "grafana.fullname" . }}-test - namespace: {{ include "grafana.namespace" . }} - annotations: - "helm.sh/hook": test-success - "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" - labels: - {{- include "grafana.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ include "grafana.fullname" . }}-test -subjects: - - kind: ServiceAccount - name: {{ include "grafana.serviceAccountNameTest" . }} - namespace: {{ include "grafana.namespace" . }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-serviceaccount.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-serviceaccount.yaml deleted file mode 100644 index 38fba3596a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test-serviceaccount.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if and .Values.testFramework.enabled .Values.serviceAccount.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - {{- include "grafana.labels" . | nindent 4 }} - name: {{ include "grafana.serviceAccountNameTest" . }} - namespace: {{ include "grafana.namespace" . }} - annotations: - "helm.sh/hook": test-success - "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test.yaml deleted file mode 100644 index 9831193d77..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/templates/tests/test.yaml +++ /dev/null @@ -1,49 +0,0 @@ -{{- if .Values.testFramework.enabled }} -{{- $root := . }} -apiVersion: v1 -kind: Pod -metadata: - name: {{ include "grafana.fullname" . }}-test - labels: - {{- include "grafana.labels" . | nindent 4 }} - annotations: - "helm.sh/hook": test-success - "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" - namespace: {{ include "grafana.namespace" . }} -spec: - serviceAccountName: {{ include "grafana.serviceAccountNameTest" . }} - {{- with .Values.testFramework.securityContext }} - securityContext: - {{- toYaml . | nindent 4 }} - {{- end }} - {{- if or .Values.image.pullSecrets .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- include "grafana.imagePullSecrets" (dict "root" $root "imagePullSecrets" .Values.image.pullSecrets) | nindent 4 }} - {{- end }} - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- tpl (toYaml .) $root | nindent 4 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 4 }} - {{- end }} - containers: - - name: {{ .Release.Name }}-test - image: "{{ template "system_default_registry" . }}{{ .Values.testFramework.image}}:{{ .Values.testFramework.tag }}" - imagePullPolicy: "{{ .Values.testFramework.imagePullPolicy}}" - command: ["/opt/bats/bin/bats", "-t", "/tests/run.sh"] - volumeMounts: - - mountPath: /tests - name: tests - readOnly: true - volumes: - - name: tests - configMap: - name: {{ include "grafana.fullname" . }}-test - restartPolicy: Never -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/values.yaml deleted file mode 100644 index 057645f400..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/grafana/values.yaml +++ /dev/null @@ -1,1256 +0,0 @@ -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - - # To help compatibility with other charts which use global.imagePullSecrets. - # Allow either an array of {name: pullSecret} maps (k8s-style), or an array of strings (more common helm-style). - # Can be tempalted. - # global: - # imagePullSecrets: - # - name: pullSecret1 - # - name: pullSecret2 - # or - # global: - # imagePullSecrets: - # - pullSecret1 - # - pullSecret2 - imagePullSecrets: [] - -rbac: - create: true - ## Use an existing ClusterRole/Role (depending on rbac.namespaced false/true) - # useExistingRole: name-of-some-(cluster)role - pspEnabled: false - pspUseAppArmor: false - namespaced: false - extraRoleRules: [] - # - apiGroups: [] - # resources: [] - # verbs: [] - extraClusterRoleRules: [] - # - apiGroups: [] - # resources: [] - # verbs: [] -serviceAccount: - create: true - name: - nameTest: - ## ServiceAccount labels. - labels: {} -## Service account annotations. Can be templated. -# annotations: -# eks.amazonaws.com/role-arn: arn:aws:iam::123456789000:role/iam-role-name-here - autoMount: true - -replicas: 1 - -## Create a headless service for the deployment -headlessService: false - -## Create HorizontalPodAutoscaler object for deployment type -# -autoscaling: - enabled: false - minReplicas: 1 - maxReplicas: 5 - targetCPU: "60" - targetMemory: "" - behavior: {} - -## See `kubectl explain poddisruptionbudget.spec` for more -## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/ -podDisruptionBudget: {} -# apiVersion: "" -# minAvailable: 1 -# maxUnavailable: 1 - -## See `kubectl explain deployment.spec.strategy` for more -## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy -deploymentStrategy: - type: RollingUpdate - -readinessProbe: - httpGet: - path: /api/health - port: 3000 - -livenessProbe: - httpGet: - path: /api/health - port: 3000 - initialDelaySeconds: 60 - timeoutSeconds: 30 - failureThreshold: 10 - -## Use an alternate scheduler, e.g. "stork". -## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ -## -# schedulerName: "default-scheduler" - -image: - repository: rancher/mirrored-grafana-grafana - # Overrides the Grafana image tag whose default is the chart appVersion - tag: 9.1.5 - sha: "" - 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/ - ## Can be templated. - ## - pullSecrets: [] - # - myRegistrKeySecretName - -testFramework: - enabled: false - image: "rancher/mirrored-bats-bats" - tag: "v1.4.1" - imagePullPolicy: IfNotPresent - securityContext: - runAsNonRoot: true - runAsUser: 1000 - -securityContext: - runAsNonRoot: true - runAsUser: 472 - runAsGroup: 472 - fsGroup: 472 - -containerSecurityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - seccompProfile: - type: RuntimeDefault - -# Enable creating the grafana configmap -createConfigmap: true - -# Extra configmaps to mount in grafana pods -# Values are templated. -extraConfigmapMounts: [] - # - name: certs-configmap - # mountPath: /etc/grafana/ssl/ - # subPath: certificates.crt # (optional) - # configMap: certs-configmap - # readOnly: true - - -extraEmptyDirMounts: [] - # - name: provisioning-notifiers - # mountPath: /etc/grafana/provisioning/notifiers - - -# Apply extra labels to common labels. -extraLabels: {} - -## Assign a PriorityClassName to pods if set -# priorityClassName: - -downloadDashboardsImage: - repository: rancher/mirrored-curlimages-curl - tag: 7.85.0 - sha: "" - pullPolicy: IfNotPresent - -downloadDashboards: - env: {} - envFromSecret: "" - resources: {} - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - seccompProfile: - type: RuntimeDefault - envValueFrom: {} - # ENV_NAME: - # configMapKeyRef: - # name: configmap-name - # key: value_key - -## Pod Annotations -# podAnnotations: {} - -## Pod Labels -# podLabels: {} - -podPortName: grafana -gossipPortName: gossip -## Deployment annotations -# annotations: {} - -## Expose the grafana service to be accessed from outside the cluster (LoadBalancer service). -## or access it from within the cluster (ClusterIP service). Set the service type and the port to serve it. -## ref: http://kubernetes.io/docs/user-guide/services/ -## -service: - enabled: true - type: ClusterIP - port: 80 - targetPort: 3000 - # targetPort: 4181 To be used with a proxy extraContainer - ## Service annotations. Can be templated. - annotations: {} - labels: {} - portName: service - # Adds the appProtocol field to the service. This allows to work with istio protocol selection. Ex: "http" or "tcp" - appProtocol: "" - -serviceMonitor: - ## If true, a ServiceMonitor CRD is created for a prometheus operator - ## https://github.com/coreos/prometheus-operator - ## - enabled: false - path: /metrics - # namespace: monitoring (defaults to use the namespace this chart is deployed to) - labels: {} - interval: 1m - scheme: http - tlsConfig: {} - scrapeTimeout: 30s - relabelings: [] - metricRelabelings: [] - targetLabels: [] - -extraExposePorts: [] - # - name: keycloak - # port: 8080 - # targetPort: 8080 - # type: ClusterIP - -# overrides pod.spec.hostAliases in the grafana deployment's pods -hostAliases: [] - # - ip: "1.2.3.4" - # hostnames: - # - "my.host.com" - -ingress: - enabled: false - # For Kubernetes >= 1.18 you should specify the ingress-controller via the field ingressClassName - # See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#specifying-the-class-of-an-ingress - # ingressClassName: nginx - # Values can be templated - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: / - - # pathType is only for k8s >= 1.18 - pathType: Prefix - - hosts: - - chart-example.local - ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services. - extraPaths: [] - # - path: /* - # backend: - # serviceName: ssl-redirect - # servicePort: use-annotation - ## Or for k8s > 1.19 - # - path: /* - # pathType: Prefix - # backend: - # service: - # name: ssl-redirect - # port: - # name: use-annotation - - - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - -resources: {} -# limits: -# cpu: 100m -# memory: 128Mi -# requests: -# cpu: 100m -# memory: 128Mi - -## Node labels for pod assignment -## ref: https://kubernetes.io/docs/user-guide/node-selection/ -# -nodeSelector: {} - -## Tolerations for pod assignment -## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -## -tolerations: [] - -## Affinity for pod assignment (evaluated as template) -## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity -## -affinity: {} - -## Topology Spread Constraints -## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ -## -topologySpreadConstraints: [] - -## Additional init containers (evaluated as template) -## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ -## -extraInitContainers: [] - -## Enable an Specify container in extraContainers. This is meant to allow adding an authentication proxy to a grafana pod -extraContainers: "" -# extraContainers: | -# - name: proxy -# image: quay.io/gambol99/keycloak-proxy:latest -# args: -# - -provider=github -# - -client-id= -# - -client-secret= -# - -github-org= -# - -email-domain=* -# - -cookie-secret= -# - -http-address=http://0.0.0.0:4181 -# - -upstream-url=http://127.0.0.1:3000 -# ports: -# - name: proxy-web -# containerPort: 4181 - -## Volumes that can be used in init containers that will not be mounted to deployment pods -extraContainerVolumes: [] -# - name: volume-from-secret -# secret: -# secretName: secret-to-mount -# - name: empty-dir-volume -# emptyDir: {} - -## Enable persistence using Persistent Volume Claims -## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ -## -persistence: - type: pvc - enabled: false - # storageClassName: default - accessModes: - - ReadWriteOnce - size: 10Gi - # annotations: {} - finalizers: - - kubernetes.io/pvc-protection - # selectorLabels: {} - ## Sub-directory of the PV to mount. Can be templated. - # subPath: "" - ## Name of an existing PVC. Can be templated. - # existingClaim: - ## Extra labels to apply to a PVC. - extraPvcLabels: {} - - ## If persistence is not enabled, this allows to mount the - ## local storage in-memory to improve performance - ## - inMemory: - enabled: false - ## The maximum usage on memory medium EmptyDir would be - ## the minimum value between the SizeLimit specified - ## here and the sum of memory limits of all containers in a pod - ## - # sizeLimit: 300Mi - -initChownData: - ## If false, data ownership will not be reset at startup - ## This allows the grafana-server to be run with an arbitrary user - ## - enabled: true - - ## initChownData container image - ## - image: - repository: rancher/mirrored-library-busybox - tag: "1.31.1" - sha: "" - pullPolicy: IfNotPresent - - ## initChownData resource requests and limits - ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## - resources: {} - # limits: - # cpu: 100m - # memory: 128Mi - # requests: - # cpu: 100m - # memory: 128Mi - securityContext: - runAsNonRoot: false - runAsUser: 0 - seccompProfile: - type: RuntimeDefault - capabilities: - add: - - CHOWN - -# Administrator credentials when not using an existing secret (see below) -adminUser: admin -# adminPassword: strongpassword - -# Use an existing secret for the admin user. -admin: - ## Name of the secret. Can be templated. - existingSecret: "" - userKey: admin-user - passwordKey: admin-password - -## Define command to be executed at startup by grafana container -## Needed if using `vault-env` to manage secrets (ref: https://banzaicloud.com/blog/inject-secrets-into-pods-vault/) -## Default is "run.sh" as defined in grafana's Dockerfile -# command: -# - "sh" -# - "/run.sh" - -## Optionally define args if command is used -## Needed if using `hashicorp/envconsul` to manage secrets -## By default no arguments are set -# args: -# - "-secret" -# - "secret/grafana" -# - "./grafana" - -## Extra environment variables that will be pass onto deployment pods -## -## to provide grafana with access to CloudWatch on AWS EKS: -## 1. create an iam role of type "Web identity" with provider oidc.eks.* (note the provider for later) -## 2. edit the "Trust relationships" of the role, add a line inside the StringEquals clause using the -## same oidc eks provider as noted before (same as the existing line) -## also, replace NAMESPACE and prometheus-operator-grafana with the service account namespace and name -## -## "oidc.eks.us-east-1.amazonaws.com/id/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:sub": "system:serviceaccount:NAMESPACE:prometheus-operator-grafana", -## -## 3. attach a policy to the role, you can use a built in policy called CloudWatchReadOnlyAccess -## 4. use the following env: (replace 123456789000 and iam-role-name-here with your aws account number and role name) -## -## env: -## AWS_ROLE_ARN: arn:aws:iam::123456789000:role/iam-role-name-here -## AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token -## AWS_REGION: us-east-1 -## -## 5. uncomment the EKS section in extraSecretMounts: below -## 6. uncomment the annotation section in the serviceAccount: above -## make sure to replace arn:aws:iam::123456789000:role/iam-role-name-here with your role arn - -env: {} - -## "valueFrom" environment variable references that will be added to deployment pods. Name is templated. -## ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/#envvarsource-v1-core -## Renders in container spec as: -## env: -## ... -## - name: -## valueFrom: -## -envValueFrom: {} - # ENV_NAME: - # configMapKeyRef: - # name: configmap-name - # key: value_key - -## The name of a secret in the same kubernetes namespace which contain values to be added to the environment -## This can be useful for auth tokens, etc. Value is templated. -envFromSecret: "" - -## Sensible environment variables that will be rendered as new secret object -## This can be useful for auth tokens, etc. -## If the secret values contains "{{", they'll need to be properly escaped so that they are not interpreted by Helm -## ref: https://helm.sh/docs/howto/charts_tips_and_tricks/#using-the-tpl-function -envRenderSecret: {} - -## The names of secrets in the same kubernetes namespace which contain values to be added to the environment -## Each entry should contain a name key, and can optionally specify whether the secret must be defined with an optional key. -## Name is templated. -envFromSecrets: [] -## - name: secret-name -## optional: true - -## The names of conifgmaps in the same kubernetes namespace which contain values to be added to the environment -## Each entry should contain a name key, and can optionally specify whether the configmap must be defined with an optional key. -## Name is templated. -## ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#configmapenvsource-v1-core -envFromConfigMaps: [] -## - name: configmap-name -## optional: true - -# Inject Kubernetes services as environment variables. -# See https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#environment-variables -enableServiceLinks: true - -## Additional grafana server secret mounts -# Defines additional mounts with secrets. Secrets must be manually created in the namespace. -extraSecretMounts: [] - # - name: secret-files - # mountPath: /etc/secrets - # secretName: grafana-secret-files - # readOnly: true - # subPath: "" - # - # for AWS EKS (cloudwatch) use the following (see also instruction in env: above) - # - name: aws-iam-token - # mountPath: /var/run/secrets/eks.amazonaws.com/serviceaccount - # readOnly: true - # projected: - # defaultMode: 420 - # sources: - # - serviceAccountToken: - # audience: sts.amazonaws.com - # expirationSeconds: 86400 - # path: token - # - # for CSI e.g. Azure Key Vault use the following - # - name: secrets-store-inline - # mountPath: /run/secrets - # readOnly: true - # csi: - # driver: secrets-store.csi.k8s.io - # readOnly: true - # volumeAttributes: - # secretProviderClass: "akv-grafana-spc" - # nodePublishSecretRef: # Only required when using service principal mode - # name: grafana-akv-creds # Only required when using service principal mode - -## Additional grafana server volume mounts -# Defines additional volume mounts. -extraVolumeMounts: [] - # - name: extra-volume-0 - # mountPath: /mnt/volume0 - # readOnly: true - # existingClaim: volume-claim - # - name: extra-volume-1 - # mountPath: /mnt/volume1 - # readOnly: true - # hostPath: /usr/shared/ - # - name: grafana-secrets - # mountPath: /mnt/volume2 - # csi: true - # data: - # driver: secrets-store.csi.k8s.io - # readOnly: true - # volumeAttributes: - # secretProviderClass: "grafana-env-spc" - -## Container Lifecycle Hooks. Execute a specific bash command or make an HTTP request -lifecycleHooks: {} - # postStart: - # exec: - # command: [] - -## Pass the plugins you want installed as a list. -## -plugins: [] - # - digrich-bubblechart-panel - # - grafana-clock-panel - ## You can also use other plugin download URL, as long as they are valid zip files, - ## and specify the name of the plugin after the semicolon. Like this: - # - https://grafana.com/api/plugins/marcusolsson-json-datasource/versions/1.3.2/download;marcusolsson-json-datasource - -## Configure grafana datasources -## ref: http://docs.grafana.org/administration/provisioning/#datasources -## -datasources: {} -# datasources.yaml: -# apiVersion: 1 -# datasources: -# - name: Prometheus -# type: prometheus -# url: http://prometheus-prometheus-server -# access: proxy -# isDefault: true -# - name: CloudWatch -# type: cloudwatch -# access: proxy -# uid: cloudwatch -# editable: false -# jsonData: -# authType: default -# defaultRegion: us-east-1 -# deleteDatasources: [] -# - name: Prometheus - -## Configure grafana alerting (can be templated) -## ref: http://docs.grafana.org/administration/provisioning/#alerting -## -alerting: {} - # rules.yaml: - # apiVersion: 1 - # groups: - # - orgId: 1 - # name: '{{ .Chart.Name }}_my_rule_group' - # folder: my_first_folder - # interval: 60s - # rules: - # - uid: my_id_1 - # title: my_first_rule - # condition: A - # data: - # - refId: A - # datasourceUid: '-100' - # model: - # conditions: - # - evaluator: - # params: - # - 3 - # type: gt - # operator: - # type: and - # query: - # params: - # - A - # reducer: - # type: last - # type: query - # datasource: - # type: __expr__ - # uid: '-100' - # expression: 1==0 - # intervalMs: 1000 - # maxDataPoints: 43200 - # refId: A - # type: math - # dashboardUid: my_dashboard - # panelId: 123 - # noDataState: Alerting - # for: 60s - # annotations: - # some_key: some_value - # labels: - # team: sre_team_1 - # contactpoints.yaml: - # apiVersion: 1 - # contactPoints: - # - orgId: 1 - # name: cp_1 - # receivers: - # - uid: first_uid - # type: pagerduty - # settings: - # integrationKey: XXX - # severity: critical - # class: ping failure - # component: Grafana - # group: app-stack - # summary: | - # {{ `{{ include "default.message" . }}` }} - -## Configure notifiers -## ref: http://docs.grafana.org/administration/provisioning/#alert-notification-channels -## -notifiers: {} -# notifiers.yaml: -# notifiers: -# - name: email-notifier -# type: email -# uid: email1 -# # either: -# org_id: 1 -# # or -# org_name: Main Org. -# is_default: true -# settings: -# addresses: an_email_address@example.com -# delete_notifiers: - -## Configure grafana dashboard providers -## ref: http://docs.grafana.org/administration/provisioning/#dashboards -## -## `path` must be /var/lib/grafana/dashboards/ -## -dashboardProviders: {} -# dashboardproviders.yaml: -# apiVersion: 1 -# providers: -# - name: 'default' -# orgId: 1 -# folder: '' -# type: file -# disableDeletion: false -# editable: true -# options: -# path: /var/lib/grafana/dashboards/default - -## Configure grafana dashboard to import -## NOTE: To use dashboards you must also enable/configure dashboardProviders -## ref: https://grafana.com/dashboards -## -## dashboards per provider, use provider name as key. -## -dashboards: {} - # default: - # some-dashboard: - # json: | - # $RAW_JSON - # custom-dashboard: - # file: dashboards/custom-dashboard.json - # prometheus-stats: - # gnetId: 2 - # revision: 2 - # datasource: Prometheus - # local-dashboard: - # url: https://example.com/repository/test.json - # token: '' - # local-dashboard-base64: - # url: https://example.com/repository/test-b64.json - # token: '' - # b64content: true - # local-dashboard-gitlab: - # url: https://example.com/repository/test-gitlab.json - # gitlabToken: '' - # local-dashboard-bitbucket: - # url: https://example.com/repository/test-bitbucket.json - # bearerToken: '' - # local-dashboard-azure: - # url: https://example.com/repository/test-azure.json - # basic: '' - # acceptHeader: '*/*' - -## Reference to external ConfigMap per provider. Use provider name as key and ConfigMap name as value. -## A provider dashboards must be defined either by external ConfigMaps or in values.yaml, not in both. -## ConfigMap data example: -## -## data: -## example-dashboard.json: | -## RAW_JSON -## -dashboardsConfigMaps: {} -# default: "" - -## Grafana's primary configuration -## NOTE: values in map will be converted to ini format -## ref: http://docs.grafana.org/installation/configuration/ -## -grafana.ini: - paths: - data: /var/lib/grafana/ - logs: /var/log/grafana - plugins: /var/lib/grafana/plugins - provisioning: /etc/grafana/provisioning - analytics: - check_for_updates: true - log: - mode: console - grafana_net: - url: https://grafana.net - server: - domain: "{{ if (and .Values.ingress.enabled .Values.ingress.hosts) }}{{ .Values.ingress.hosts | first }}{{ else }}''{{ end }}" -## grafana Authentication can be enabled with the following values on grafana.ini - # server: - # The full public facing url you use in browser, used for redirects and emails - # root_url: - # https://grafana.com/docs/grafana/latest/auth/github/#enable-github-in-grafana - # auth.github: - # enabled: false - # allow_sign_up: false - # scopes: user:email,read:org - # auth_url: https://github.com/login/oauth/authorize - # token_url: https://github.com/login/oauth/access_token - # api_url: https://api.github.com/user - # team_ids: - # allowed_organizations: - # client_id: - # client_secret: -## LDAP Authentication can be enabled with the following values on grafana.ini -## NOTE: Grafana will fail to start if the value for ldap.toml is invalid - # auth.ldap: - # enabled: true - # allow_sign_up: true - # config_file: /etc/grafana/ldap.toml - -## Grafana's LDAP configuration -## Templated by the template in _helpers.tpl -## NOTE: To enable the grafana.ini must be configured with auth.ldap.enabled -## ref: http://docs.grafana.org/installation/configuration/#auth-ldap -## ref: http://docs.grafana.org/installation/ldap/#configuration -ldap: - enabled: false - # `existingSecret` is a reference to an existing secret containing the ldap configuration - # for Grafana in a key `ldap-toml`. - existingSecret: "" - # `config` is the content of `ldap.toml` that will be stored in the created secret - config: "" - # config: |- - # verbose_logging = true - - # [[servers]] - # host = "my-ldap-server" - # port = 636 - # use_ssl = true - # start_tls = false - # ssl_skip_verify = false - # bind_dn = "uid=%s,ou=users,dc=myorg,dc=com" - -## Grafana's SMTP configuration -## NOTE: To enable, grafana.ini must be configured with smtp.enabled -## ref: http://docs.grafana.org/installation/configuration/#smtp -smtp: - # `existingSecret` is a reference to an existing secret containing the smtp configuration - # for Grafana. - existingSecret: "" - userKey: "user" - passwordKey: "password" - -## Sidecars that collect the configmaps with specified label and stores the included files them into the respective folders -## Requires at least Grafana 5 to work and can't be used together with parameters dashboardProviders, datasources and dashboards -sidecar: - image: - repository: rancher/mirrored-kiwigrid-k8s-sidecar - tag: 1.24.6 - sha: "" - imagePullPolicy: IfNotPresent - resources: {} -# limits: -# cpu: 100m -# memory: 100Mi -# requests: -# cpu: 50m -# memory: 50Mi - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - seccompProfile: - type: RuntimeDefault - # skipTlsVerify Set to true to skip tls verification for kube api calls - # skipTlsVerify: true - enableUniqueFilenames: false - readinessProbe: {} - livenessProbe: {} - # Log level default for all sidecars. Can be one of: DEBUG, INFO, WARN, ERROR, CRITICAL. Defaults to INFO - # logLevel: INFO - alerts: - enabled: false - # Additional environment variables for the alerts sidecar - env: {} - # Do not reprocess already processed unchanged resources on k8s API reconnect. - # ignoreAlreadyProcessed: true - # label that the configmaps with alert are marked with - label: grafana_alert - # value of label that the configmaps with alert are set to - labelValue: "" - # Log level. Can be one of: DEBUG, INFO, WARN, ERROR, CRITICAL. - # logLevel: INFO - # If specified, the sidecar will search for alert config-maps inside this namespace. - # Otherwise the namespace in which the sidecar is running will be used. - # It's also possible to specify ALL to search in all namespaces - searchNamespace: null - # Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. - watchMethod: WATCH - # search in configmap, secret or both - resource: both - # watchServerTimeout: request to the server, asking it to cleanly close the connection after that. - # defaults to 60sec; much higher values like 3600 seconds (1h) are feasible for non-Azure K8S - # watchServerTimeout: 3600 - # - # watchClientTimeout: is a client-side timeout, configuring your local socket. - # If you have a network outage dropping all packets with no RST/FIN, - # this is how long your client waits before realizing & dropping the connection. - # defaults to 66sec (sic!) - # watchClientTimeout: 60 - # - # Endpoint to send request to reload alerts - reloadURL: "http://localhost:3000/api/admin/provisioning/alerting/reload" - # Absolute path to shell script to execute after a alert got reloaded - script: null - skipReload: false - # Deploy the alert sidecar as an initContainer in addition to a container. - # Additional alert sidecar volume mounts - extraMounts: [] - # Sets the size limit of the alert sidecar emptyDir volume - sizeLimit: {} - dashboards: - enabled: false - # Additional environment variables for the dashboards sidecar - env: {} - # Do not reprocess already processed unchanged resources on k8s API reconnect. - # ignoreAlreadyProcessed: true - SCProvider: true - # label that the configmaps with dashboards are marked with - label: grafana_dashboard - # value of label that the configmaps with dashboards are set to - labelValue: "" - # Log level. Can be one of: DEBUG, INFO, WARN, ERROR, CRITICAL. - # logLevel: INFO - # folder in the pod that should hold the collected dashboards (unless `defaultFolderName` is set) - folder: /tmp/dashboards - # The default folder name, it will create a subfolder under the `folder` and put dashboards in there instead - defaultFolderName: null - # Namespaces list. If specified, the sidecar will search for config-maps/secrets inside these namespaces. - # Otherwise the namespace in which the sidecar is running will be used. - # It's also possible to specify ALL to search in all namespaces. - searchNamespace: null - # Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. - watchMethod: WATCH - # search in configmap, secret or both - resource: both - # If specified, the sidecar will look for annotation with this name to create folder and put graph here. - # You can use this parameter together with `provider.foldersFromFilesStructure`to annotate configmaps and create folder structure. - folderAnnotation: null - # Endpoint to send request to reload alerts - reloadURL: "http://localhost:3000/api/admin/provisioning/dashboards/reload" - # Absolute path to shell script to execute after a configmap got reloaded - script: null - skipReload: false - # watchServerTimeout: request to the server, asking it to cleanly close the connection after that. - # defaults to 60sec; much higher values like 3600 seconds (1h) are feasible for non-Azure K8S - # watchServerTimeout: 3600 - # - # watchClientTimeout: is a client-side timeout, configuring your local socket. - # If you have a network outage dropping all packets with no RST/FIN, - # this is how long your client waits before realizing & dropping the connection. - # defaults to 66sec (sic!) - # watchClientTimeout: 60 - # - # provider configuration that lets grafana manage the dashboards - provider: - # name of the provider, should be unique - name: sidecarProvider - # orgid as configured in grafana - orgid: 1 - # folder in which the dashboards should be imported in grafana - folder: '' - # type of the provider - type: file - # disableDelete to activate a import-only behaviour - disableDelete: false - # allow updating provisioned dashboards from the UI - allowUiUpdates: false - # allow Grafana to replicate dashboard structure from filesystem - foldersFromFilesStructure: false - # Additional dashboard sidecar volume mounts - extraMounts: [] - # Sets the size limit of the dashboard sidecar emptyDir volume - sizeLimit: {} - datasources: - enabled: false - # Additional environment variables for the datasourcessidecar - env: {} - # Do not reprocess already processed unchanged resources on k8s API reconnect. - # ignoreAlreadyProcessed: true - # label that the configmaps with datasources are marked with - label: grafana_datasource - # value of label that the configmaps with datasources are set to - labelValue: "" - # Log level. Can be one of: DEBUG, INFO, WARN, ERROR, CRITICAL. - # logLevel: INFO - # If specified, the sidecar will search for datasource config-maps inside this namespace. - # Otherwise the namespace in which the sidecar is running will be used. - # It's also possible to specify ALL to search in all namespaces - searchNamespace: null - # Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. - watchMethod: WATCH - # search in configmap, secret or both - resource: both - # watchServerTimeout: request to the server, asking it to cleanly close the connection after that. - # defaults to 60sec; much higher values like 3600 seconds (1h) are feasible for non-Azure K8S - # watchServerTimeout: 3600 - # - # watchClientTimeout: is a client-side timeout, configuring your local socket. - # If you have a network outage dropping all packets with no RST/FIN, - # this is how long your client waits before realizing & dropping the connection. - # defaults to 66sec (sic!) - # watchClientTimeout: 60 - # - # Endpoint to send request to reload datasources - reloadURL: "http://localhost:3000/api/admin/provisioning/datasources/reload" - # Absolute path to shell script to execute after a datasource got reloaded - script: null - skipReload: true - # Deploy the datasource sidecar as an initContainer in addition to a container. - # This is needed if skipReload is true, to load any datasources defined at startup time. - initDatasources: true - # Sets the size limit of the datasource sidecar emptyDir volume - sizeLimit: {} - plugins: - enabled: false - # Additional environment variables for the plugins sidecar - env: {} - # Do not reprocess already processed unchanged resources on k8s API reconnect. - # ignoreAlreadyProcessed: true - # label that the configmaps with plugins are marked with - label: grafana_plugin - # value of label that the configmaps with plugins are set to - labelValue: "" - # Log level. Can be one of: DEBUG, INFO, WARN, ERROR, CRITICAL. - # logLevel: INFO - # If specified, the sidecar will search for plugin config-maps inside this namespace. - # Otherwise the namespace in which the sidecar is running will be used. - # It's also possible to specify ALL to search in all namespaces - searchNamespace: null - # Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. - watchMethod: WATCH - # search in configmap, secret or both - resource: both - # watchServerTimeout: request to the server, asking it to cleanly close the connection after that. - # defaults to 60sec; much higher values like 3600 seconds (1h) are feasible for non-Azure K8S - # watchServerTimeout: 3600 - # - # watchClientTimeout: is a client-side timeout, configuring your local socket. - # If you have a network outage dropping all packets with no RST/FIN, - # this is how long your client waits before realizing & dropping the connection. - # defaults to 66sec (sic!) - # watchClientTimeout: 60 - # - # Endpoint to send request to reload plugins - reloadURL: "http://localhost:3000/api/admin/provisioning/plugins/reload" - # Absolute path to shell script to execute after a plugin got reloaded - script: null - skipReload: false - # Deploy the datasource sidecar as an initContainer in addition to a container. - # This is needed if skipReload is true, to load any plugins defined at startup time. - initPlugins: false - # Sets the size limit of the plugin sidecar emptyDir volume - sizeLimit: {} - notifiers: - enabled: false - # Additional environment variables for the notifierssidecar - env: {} - # Do not reprocess already processed unchanged resources on k8s API reconnect. - # ignoreAlreadyProcessed: true - # label that the configmaps with notifiers are marked with - label: grafana_notifier - # value of label that the configmaps with notifiers are set to - labelValue: "" - # Log level. Can be one of: DEBUG, INFO, WARN, ERROR, CRITICAL. - # logLevel: INFO - # If specified, the sidecar will search for notifier config-maps inside this namespace. - # Otherwise the namespace in which the sidecar is running will be used. - # It's also possible to specify ALL to search in all namespaces - searchNamespace: null - # Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. - watchMethod: WATCH - # search in configmap, secret or both - resource: both - # watchServerTimeout: request to the server, asking it to cleanly close the connection after that. - # defaults to 60sec; much higher values like 3600 seconds (1h) are feasible for non-Azure K8S - # watchServerTimeout: 3600 - # - # watchClientTimeout: is a client-side timeout, configuring your local socket. - # If you have a network outage dropping all packets with no RST/FIN, - # this is how long your client waits before realizing & dropping the connection. - # defaults to 66sec (sic!) - # watchClientTimeout: 60 - # - # Endpoint to send request to reload notifiers - reloadURL: "http://localhost:3000/api/admin/provisioning/notifications/reload" - # Absolute path to shell script to execute after a notifier got reloaded - script: null - skipReload: false - # Deploy the notifier sidecar as an initContainer in addition to a container. - # This is needed if skipReload is true, to load any notifiers defined at startup time. - initNotifiers: false - # Sets the size limit of the notifier sidecar emptyDir volume - sizeLimit: {} - -## Override the deployment namespace -## -namespaceOverride: "" - -## Number of old ReplicaSets to retain -## -revisionHistoryLimit: 10 - -## Add a seperate remote image renderer deployment/service -imageRenderer: - deploymentStrategy: {} - # Enable the image-renderer deployment & service - enabled: false - replicas: 1 - autoscaling: - enabled: false - minReplicas: 1 - maxReplicas: 5 - targetCPU: "60" - targetMemory: "" - behavior: {} - image: - # image-renderer Image repository - repository: rancher/mirrored-grafana-grafana-image-renderer - # image-renderer Image tag - tag: 3.8.0 - # image-renderer Image sha (optional) - sha: "" - # image-renderer ImagePullPolicy - pullPolicy: Always - # extra environment variables - env: - HTTP_HOST: "0.0.0.0" - # RENDERING_ARGS: --no-sandbox,--disable-gpu,--window-size=1280x758 - # RENDERING_MODE: clustered - # IGNORE_HTTPS_ERRORS: true - - ## "valueFrom" environment variable references that will be added to deployment pods. Name is templated. - ## ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/#envvarsource-v1-core - ## Renders in container spec as: - ## env: - ## ... - ## - name: - ## valueFrom: - ## - envValueFrom: {} - # ENV_NAME: - # configMapKeyRef: - # name: configmap-name - # key: value_key - - # image-renderer deployment serviceAccount - serviceAccountName: "" - # image-renderer deployment securityContext - securityContext: {} - # image-renderer deployment container securityContext - containerSecurityContext: - seccompProfile: - type: RuntimeDefault - capabilities: - drop: ['ALL'] - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - # image-renderer deployment Host Aliases - hostAliases: [] - # image-renderer deployment priority class - priorityClassName: '' - service: - # Enable the image-renderer service - enabled: true - # image-renderer service port name - portName: 'http' - # image-renderer service port used by both service and deployment - port: 8081 - targetPort: 8081 - # Adds the appProtocol field to the image-renderer service. This allows to work with istio protocol selection. Ex: "http" or "tcp" - appProtocol: "" - serviceMonitor: - ## If true, a ServiceMonitor CRD is created for a prometheus operator - ## https://github.com/coreos/prometheus-operator - ## - enabled: false - path: /metrics - # namespace: monitoring (defaults to use the namespace this chart is deployed to) - labels: {} - interval: 1m - scheme: http - tlsConfig: {} - scrapeTimeout: 30s - relabelings: [] - # See: https://doc.crds.dev/github.com/prometheus-operator/kube-prometheus/monitoring.coreos.com/ServiceMonitor/v1@v0.11.0#spec-targetLabels - targetLabels: [] - # - targetLabel1 - # - targetLabel2 - # If https is enabled in Grafana, this needs to be set as 'https' to correctly configure the callback used in Grafana - grafanaProtocol: http - # In case a sub_path is used this needs to be added to the image renderer callback - grafanaSubPath: "" - # name of the image-renderer port on the pod - podPortName: http - # number of image-renderer replica sets to keep - revisionHistoryLimit: 10 - networkPolicy: - # Enable a NetworkPolicy to limit inbound traffic to only the created grafana pods - limitIngress: true - # Enable a NetworkPolicy to limit outbound traffic to only the created grafana pods - limitEgress: false - # Allow additional services to access image-renderer (eg. Prometheus operator when ServiceMonitor is enabled) - extraIngressSelectors: [] - resources: {} -# limits: -# cpu: 100m -# memory: 100Mi -# requests: -# cpu: 50m -# memory: 50Mi - ## Node labels for pod assignment - ## ref: https://kubernetes.io/docs/user-guide/node-selection/ - # - nodeSelector: {} - - ## Tolerations for pod assignment - ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - ## - tolerations: [] - - ## Affinity for pod assignment (evaluated as template) - ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity - ## - affinity: {} - - ## Use an alternate scheduler, e.g. "stork". - ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ - ## - # schedulerName: "default-scheduler" - -networkPolicy: - ## @param networkPolicy.enabled Enable creation of NetworkPolicy resources. Only Ingress traffic is filtered for now. - ## - enabled: false - ## @param networkPolicy.allowExternal Don't require client label for connections - ## The Policy model to apply. When set to false, only pods with the correct - ## client label will have network access to grafana port defined. - ## When true, grafana will accept connections from any source - ## (with the correct destination port). - ## - ingress: true - ## @param networkPolicy.ingress When true enables the creation - ## an ingress network policy - ## - allowExternal: true - ## @param networkPolicy.explicitNamespacesSelector A Kubernetes LabelSelector to explicitly select namespaces from which traffic could be allowed - ## If explicitNamespacesSelector is missing or set to {}, only client Pods that are in the networkPolicy's namespace - ## and that match other criteria, the ones that have the good label, can reach the grafana. - ## But sometimes, we want the grafana to be accessible to clients from other namespaces, in this case, we can use this - ## LabelSelector to select these namespaces, note that the networkPolicy's namespace should also be explicitly added. - ## - ## Example: - ## explicitNamespacesSelector: - ## matchLabels: - ## role: frontend - ## matchExpressions: - ## - {key: role, operator: In, values: [frontend]} - ## - explicitNamespacesSelector: {} - ## - ## - ## - ## - ## - ## - egress: - ## @param networkPolicy.egress.enabled When enabled, an egress network policy will be - ## created allowing grafana to connect to external data sources from kubernetes cluster. - enabled: false - ## - ## @param networkPolicy.egress.ports Add individual ports to be allowed by the egress - ports: [] - ## Add ports to the egress by specifying - port: - ## E.X. - ## ports: - ## - port: 80 - ## - port: 443 - ## - ## - ## - ## - ## - ## - -# Enable backward compatibility of kubernetes where version below 1.13 doesn't have the enableServiceLinks option -enableKubeBackwardCompatibility: false -useStatefulSet: false -# Create a dynamic manifests via values: -extraObjects: [] - # - apiVersion: "kubernetes-client.io/v1" - # kind: ExternalSecret - # metadata: - # name: grafana-secrets - # spec: - # backendType: gcpSecretsManager - # data: - # - key: grafana-admin-password - # name: adminPassword diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/Chart.yaml deleted file mode 100644 index cf492119cc..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/Chart.yaml +++ /dev/null @@ -1,14 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.29.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-pushprox -apiVersion: v1 -appVersion: 0.1.0 -description: Sets up a deployment of the PushProx proxy and a DaemonSet of PushProx - clients. -name: hardenedKubelet -type: application -version: 0.2.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/README.md deleted file mode 100644 index 345002f48a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# rancher-pushprox - -A Rancher chart based on Rancher [PushProx](https://github.com/rancher/PushProx) that sets up a Deployment of a PushProx proxy and a DaemonSet of PushProx clients on a Kubernetes cluster. - -Installs [rancher-pushprox](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-pushprox) to create PushProx clients that can access their host's network and register with a PushProx proxy. A [Prometheus Operator](https://github.com/coreos/prometheus-operator) ServiceMonitor CR is also included that is configured to scrape the metrics from each of the clients through the proxy. - -Using an instance of this chart is suitable for the following scenarios: -- You need to scrape metrics from a port that should not be accessible outside of the host (e.g. scraping `etcd` metrics in a hardened cluster) -- You need to scrape metrics on a host that are not exposed outside of 127.0.0.1 (e.g. scraping `kube-proxy` metrics) -- You need to scrape metrics through HTTPS using certs hosted directly on `hostPath` -- You need to scrape metrics from Kubernetes components that require authorization via a service account (e.g. permissions to make request to `/metrics`) -- You need to scrape metrics without access to cacerts (i.e. enable `insecureSkipVerify`) - -The clients and proxy are created based on a Rancher fork of the [prometheus-community/PushProx](https://github.com/prometheus-community/PushProx) project. - -## Upgrading to Kubernetes v1.25+ - -Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. - -As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `global.cattle.psp.enabled` set to `false` if it has been previously set to `true`. -​ -> **Note:** -> In this chart release, any previous field that was associated with any PSP resources have been removed in favor of a single global field: `global.cattle.psp.enabled`. - -> **Note:** -> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** -> -> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. - -Upon setting `global.cattle.psp.enabled` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. - -As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. - -## Configuration - -The following tables list the configurable parameters of the rancher-pushprox chart and their default values. - -### General - -#### Required -| Parameter | Description | Example | -| ----- | ----------- | ------ | -| `component` | The component that is being monitored | `kube-etcd` -| `metricsPort` | The port on the host that contains the metrics you want to scrape (e.g. `http://:/metrics`) | `2379` | -| `namespaceOverride` | The namespace to install the chart | `""` - -#### Optional -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `serviceMonitor.enabled` | Deploys a [Prometheus Operator](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor) ServiceMonitor CR that is configured to scrape metrics on the hosts that the clients are deployed on via the proxy. Also deploys a Service that points to all pods with the expected client name that exposes the `metricsPort` selected | `true` | -| `serviceMonitor.endpoints` | A list of endpoints that will be added to the ServiceMonitor based on the [Endpoint spec](https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint) | `[{port: metrics}]` | -| `service.selector` | The selector that is used to populate the Service's Endpoints object. The chart will error out on rendering templating if `.Values.clients.enabled` is set alongside this field, since it is expected that this service should point to the PushProx Clients Daemonset / Deployment | `{}` | -| `clients.enabled` | Deploys a DaemonSet of clients that are each capable of scraping endpoints on the hostNetwork it is deployed on | `true` | -| `clients.port` | The port where the client will publish PushProx client-specific metrics. If deploying multiple clients onto the same node, the clients should not have conflicting ports | `9369` | -| `clients.proxyUrl` | Overrides the default proxyUrl setting of `http://pushprox-{{ .Values.component }}-proxy.{{ . Release.Namespace }}.svc.cluster.local:{{ .Values.proxy.port }}"` with the `proxyUrl` specified | `""` | -| `clients.useLocalhost` | Sets a flag on each client deployment to redirect scrapes directed to `HOST_IP` to `127.0.0.1` | `false` | -| `clients.https.enabled` | Enables scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.forceHTTPSScheme` | Forces scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.useServiceAccountCredentials` | If set to true, the client will create a service account with permissions to scrape `/metrics` endpoint of Kubernetes components. The client will use the service account token provided to make authorized scrape requests to the Kubernetes API | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.enabled` | If set to true, the client will use service account credentials mounted at the configured path `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath`. This requires permissions to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath` | This is a volume mount on the pod with permissions to scrape `/metrics` endpoint of Kubernetes components | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | -| `clients.https.authenticationMethod.bearerTokenSecret.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.authorization.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components | `false` | -| `clients.https.authenticationMethod.authorization.type` | If set, the client will use this type of authorization in its client requests for metrics | `"bearer"` | -| `clients.https.authenticationMethod.authorization.credentials.key` | If set, the client will use this key in the secret created by `clients.https.useServiceAccountCredentials` for authorization in its client requests for metrics | `"token"` | -| `clients.https.authenticationMethod.authorization.credentials.optional` | If set to false, the client will fail if the key in the secret created by `clients.https.useServiceAccountCredentials` does not exist | `false` | -| `clients.https.insecureSkipVerify` | If set to true, the client will disable SSL security checks | `false` | -| `clients.https.certDir` | A `hostPath` where TLS certs can be found. This path is mounted as a volume on an `initContainer` which copies only the necessary files over to an EmptyDir volume used by each client. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.certFile` | The path to the TLS cert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.keyFile` | The path to the TLS key file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.caCertFile` | The path to the TLS cacert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.seLinuxOptions` | seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. | `""` | -| `clients.metrics.enabled` | Whether the client should publish PushProx client-specific metrics. | `false` | -| `clients.rbac.additionalRules` | Additional permissions to provide to the ServiceAccount bound to the client. This can be used to provide additional permissions for the client to scrape metrics from the k8s API. Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true | `[]` | -| `clients.deployment.enabled` | Deploys the client as a Deployment (generally used if the underlying hostNetwork Pod that is being scraped is managed by a Deployment) | `false` | -| `clients.deployment.replicas` | The number of pods the Deployment has, it should match the number of pod the hostNetwork Deployment has. Required and only used if `client.deployment.enable` is set | `0` | -| `clients.deployment.affinity` | The affinity rules that allocate the pod to the node in which the hostNetwork Deployment's pods run. Required and only used if `client.deployment.enable` is set | `{}` | -| `clients.resources` | Set resource limits and requests for the client container | `{}` | -| `clients.nodeSelector` | Select which nodes to deploy the clients on | `{}` | -| `clients.tolerations` | Specify tolerations for clients | `[]` | -| `proxy.enabled` | Deploys the proxy that each client will register with | `true` | -| `proxy.port` | The port exposed by the proxy that each client will register with to allow metrics to be scraped from the host | `8080` | -| `proxy.resources` | Set resource limits and requests for the proxy container | `{}` | -| `proxy.nodeSelector` | Select which nodes the proxy can be deployed on | `{}` | -| `proxy.tolerations` | Specify tolerations (if necessary) to allow the proxy to be deployed on the selected node | `[]` | -| `kubeVersionOverrides` | A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches any of the semver constraints provided as keys on the map. On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. | `[]` - -*Tip: The filepaths set in `clients.https.File` can include wildcard characters*. - -See [rancher-monitoring](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-monitoring) for examples of how this chart can be used. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/_helpers.tpl deleted file mode 100644 index 8e651dccfd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/_helpers.tpl +++ /dev/null @@ -1,166 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# General - -{{- define "applyKubeVersionOverrides" -}} -{{- $overrides := dict -}} -{{- range $override := .Values.kubeVersionOverrides -}} -{{- if semverCompare $override.constraint $.Capabilities.KubeVersion.Version -}} -{{- $_ := mergeOverwrite $overrides $override.values -}} -{{- end -}} -{{- end -}} -{{- $_ := mergeOverwrite .Values $overrides -}} -{{- end -}} - -{{- define "pushprox.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{- define "pushProxy.commonLabels" -}} -release: {{ .Release.Name }} -component: {{ .Values.component | quote }} -provider: kubernetes -{{- end -}} - -{{- define "pushProxy.proxyUrl" -}} -{{- $_ := (required "Template requires either .Values.proxy.port or .Values.client.proxyUrl to set proxyUrl for client" (or .Values.clients.proxyUrl .Values.proxy.port)) -}} -{{- if .Values.clients.proxyUrl -}} -{{ printf "%s" .Values.clients.proxyUrl }} -{{- else -}} -{{ printf "http://%s.%s.svc:%d" (include "pushProxy.proxy.name" .) (include "pushprox.namespace" .) (int .Values.proxy.port) }} -{{- end -}}{{- end -}} - -# Client - -{{- define "pushProxy.client.name" -}} -{{- printf "pushprox-%s-client" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.serviceAccountTokenName" -}} -{{- printf "pushprox-%s-client-service-account-token" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.labels" -}} -k8s-app: {{ template "pushProxy.client.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# Proxy - -{{- define "pushProxy.proxy.name" -}} -{{- printf "pushprox-%s-proxy" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.proxy.labels" -}} -k8s-app: {{ template "pushProxy.proxy.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# ServiceMonitor - -{{- define "pushprox.serviceMonitor.name" -}} -{{- printf "%s-%s" .Release.Name (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.labels" -}} -app: {{ template "pushprox.serviceMonitor.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.endpoints" -}} -{{- $proxyURL := (include "pushProxy.proxyUrl" .) -}} -{{- $useHTTPS := .Values.clients.https.enabled -}} -{{- $forceHTTPSScheme := .Values.clients.https.forceHTTPSScheme -}} -{{- $insecureSkipVerify := .Values.clients.https.insecureSkipVerify -}} -{{- $useServiceAccountCredentials := .Values.clients.https.useServiceAccountCredentials -}} -{{- $serviceAccountTokenName := (include "pushProxy.client.serviceAccountTokenName" . ) -}} -{{- $metricRelabelings := list }} -{{- $endpoints := .Values.serviceMonitor.endpoints }} -{{- range $endpoints }} -{{- if $.Values.proxy.enabled }} -{{- $_ := set . "proxyUrl" $proxyURL }} -{{- end }} -{{- $clusterIdRelabel := dict }} -{{- if $.Values.global.cattle.clusterId }} -{{- $_ := set $clusterIdRelabel "action" "replace" }} -{{- $_ := set $clusterIdRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterIdRelabel "targetLabel" "cluster_id" }} -{{- $_ := set $clusterIdRelabel "replacement" $.Values.global.cattle.clusterId }} -{{- end }} -{{- $clusterNameRelabel := dict }} -{{- if $.Values.global.cattle.clusterName }} -{{- $_ := set $clusterNameRelabel "action" "replace" }} -{{- $_ := set $clusterNameRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterNameRelabel "targetLabel" "cluster_name" }} -{{- $_ := set $clusterNameRelabel "replacement" $.Values.global.cattle.clusterName }} -{{- end }} -{{- $metricRelabelings := gt (len (keys $clusterNameRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterNameRelabel)) ($metricRelabelings) }} -{{- $metricRelabelings := gt (len (keys $clusterIdRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterIdRelabel)) ($metricRelabelings) }} -{{- if not (empty $metricRelabelings) }} -{{- $_ := set . "metricRelabelings" ($metricRelabelings)}} -{{- end }} -{{- if $forceHTTPSScheme -}} -{{- $_ := set . "scheme" "https" }} -{{- end -}} -{{- if $useHTTPS -}} -{{- if (hasKey . "params") }} -{{- $_ := set (get . "params") "_scheme" (list "https") }} -{{- else }} -{{- $_ := set . "params" (dict "_scheme" (list "https")) }} -{{- end }} -{{- end }} -{{- if (hasKey . "tlsConfig") }} -{{- $_ := set (get . "tlsConfig") "insecureSkipVerify" $insecureSkipVerify }} -{{- else }} -{{- $_ := set . "tlsConfig" (dict "insecureSkipVerify" $insecureSkipVerify) }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenFile.enabled }} -{{- $_ := set . "bearerTokenFile" $.Values.clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenSecret.enabled }} -{{- $_ := set . "bearerTokenSecret" $serviceAccountTokenName }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.authorization.enabled }} -{{- if (hasKey . "authorization") }} -{{- $_ := set (get . "authorization") "type" $.Values.clients.https.authenticationMethod.authorization.type }} -{{- $_ := set (get . "authorization") "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional) }} -{{- else }} -{{- $_ := set . "authorization" (dict "type" $.Values.clients.https.authenticationMethod.authorization.type) }} -{{- $_ := set . "authorization" (dict "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional)) }} -{{- end }} -{{- end }} -{{- end }} -{{- toYaml $endpoints }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-clients-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-clients-rbac.yaml deleted file mode 100644 index a8e27c3735..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-clients-rbac.yaml +++ /dev/null @@ -1,97 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.client.name" . }} -{{- end }} -{{- if and .Values.clients.https.enabled .Values.clients.https.useServiceAccountCredentials }} -- nonResourceURLs: ["/metrics"] - verbs: ["get"] -{{- if .Values.clients.rbac.additionalRules }} -{{ toYaml .Values.clients.rbac.additionalRules }} -{{- end }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.client.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} ---- -{{- if .Values.clients.https.useServiceAccountCredentials }} -apiVersion: v1 -kind: Secret -type: kubernetes.io/service-account-token -metadata: - name: {{ template "pushProxy.client.serviceAccountTokenName" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - annotations: - kubernetes.io/service-account.name: {{ template "pushProxy.client.name" . }} -{{- end }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: true - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 6 }} -{{- end }} - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - - 'emptyDir' - - 'hostPath' - allowedHostPaths: - - pathPrefix: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - readOnly: true -{{- end }} -{{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-clients.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-clients.yaml deleted file mode 100644 index e8fcfb3883..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-clients.yaml +++ /dev/null @@ -1,157 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: apps/v1 -{{- if .Values.clients.deployment.enabled }} -kind: Deployment -{{- else }} -kind: DaemonSet -{{- end }} -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - pushprox-exporter: "client" -spec: - {{- if .Values.clients.deployment.enabled }} - replicas: {{ .Values.clients.deployment.replicas }} - {{- end }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.client.labels" . | nindent 8 }} - spec: - {{- if .Values.clients.affinity }} - affinity: {{ toYaml .Values.clients.affinity | nindent 8 }} - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.clients.nodeSelector }} -{{ toYaml .Values.clients.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.clients.tolerations }} -{{ toYaml .Values.clients.tolerations | indent 8 }} -{{- end }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - serviceAccountName: {{ template "pushProxy.client.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-client - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - {{- range .Values.clients.command }} - - {{ . | quote }} - {{- end }} - args: - - --fqdn=$(HOST_IP) - - --proxy-url=$(PROXY_URL) - {{- if .Values.clients.metrics.enabled }} - - --metrics-addr=$(PORT) - {{- end }} - - --allow-port={{ required "Need .Values.metricsPort to configure client to be allowed to scrape metrics at port" .Values.metricsPort}} - {{- if .Values.clients.useLocalhost }} - - --use-localhost - {{- end }} - {{- if .Values.clients.https.enabled }} - {{- if .Values.clients.https.insecureSkipVerify }} - - --insecure-skip-verify - {{- end }} - {{- if .Values.clients.https.useServiceAccountCredentials }} - - --token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- end }} - {{- if .Values.clients.https.certDir }} - - --tls.cert=/etc/ssl/push-proxy/push-proxy.pem - - --tls.key=/etc/ssl/push-proxy/push-proxy-key.pem - - --tls.cacert=/etc/ssl/push-proxy/push-proxy-ca-cert.pem - {{- end }} - {{- end }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if .Values.clients.metrics.enabled }} - - name: PORT - value: :{{ .Values.clients.port }} - {{- end }} - - name: PROXY_URL - value: {{ template "pushProxy.proxyUrl" . }} - securityContext: - runAsNonRoot: true - runAsUser: 1000 - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - volumeMounts: - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - {{- end }} - {{- if .Values.clients.resources }} - resources: {{ toYaml .Values.clients.resources | nindent 10 }} - {{- end }} - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - initContainers: - - name: copy-certs - image: {{ template "system_default_registry" . }}{{ .Values.clients.copyCertsImage.repository }}:{{ .Values.clients.copyCertsImage.tag }} - command: - - sh - - -c - - | - echo "Searching for files to copy within the source volume" - echo "cert: ${CERT_FILE_NAME}" - echo "key: ${KEY_FILE_NAME}" - echo "cacert: ${CACERT_FILE_NAME}" - - CERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CERT_FILE_NAME}" | sort -r | head -n 1) - KEY_FILE_SOURCE=$(find /etc/source/ -type f -name "${KEY_FILE_NAME}" | sort -r | head -n 1) - CACERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CACERT_FILE_NAME}" | sort -r | head -n 1) - - test -z ${CERT_FILE_SOURCE} && echo "Failed to find cert file" && exit 1 - test -z ${KEY_FILE_SOURCE} && echo "Failed to find key file" && exit 1 - test -z ${CACERT_FILE_SOURCE} && echo "Failed to find cacert file" && exit 1 - - echo "Copying cert file from $CERT_FILE_SOURCE to $CERT_FILE_TARGET" - cp $CERT_FILE_SOURCE $CERT_FILE_TARGET || exit 1 - chmod 444 $CERT_FILE_TARGET || exit 1 - - echo "Copying key file from $KEY_FILE_SOURCE to $KEY_FILE_TARGET" - cp $KEY_FILE_SOURCE $KEY_FILE_TARGET || exit 1 - chmod 444 $KEY_FILE_TARGET || exit 1 - - echo "Copying cacert file from $CACERT_FILE_SOURCE to $CACERT_FILE_TARGET" - cp $CACERT_FILE_SOURCE $CACERT_FILE_TARGET || exit 1 - chmod 444 $CACERT_FILE_TARGET || exit 1 - env: - - name: CERT_FILE_NAME - value: {{ required "Need a TLS cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.certFile }} - - name: KEY_FILE_NAME - value: {{ required "Need a TLS key file for scraping metrics endpoint over HTTPs" .Values.clients.https.keyFile }} - - name: CACERT_FILE_NAME - value: {{ required "Need a TLS CA cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.caCertFile }} - - name: CERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy.pem - - name: KEY_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-key.pem - - name: CACERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-ca-cert.pem - securityContext: - runAsNonRoot: false -{{- if and .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 12 }} -{{- end }} - volumeMounts: - - name: metrics-cert-dir-source - mountPath: /etc/source - readOnly: true - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - volumes: - - name: metrics-cert-dir-source - hostPath: - path: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - - name: metrics-cert-dir - emptyDir: {} - {{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-proxy-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-proxy-rbac.yaml deleted file mode 100644 index eefe609058..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-proxy-rbac.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.proxy.name" . }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.proxy.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- end }}{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-proxy.yaml deleted file mode 100644 index 723bbd6c00..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-proxy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} - pushprox-exporter: "proxy" -spec: - selector: - matchLabels: {{ include "pushProxy.proxy.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.proxy.labels" . | nindent 8 }} - spec: - securityContext: - runAsNonRoot: true - runAsUser: 1000 - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.proxy.nodeSelector }} -{{ toYaml .Values.proxy.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.proxy.tolerations }} -{{ toYaml .Values.proxy.tolerations | indent 8 }} -{{- end }} - serviceAccountName: {{ template "pushProxy.proxy.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-proxy - image: {{ template "system_default_registry" . }}{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag }} - command: - {{- range .Values.proxy.command }} - - {{ . | quote }} - {{- end }} - {{- if .Values.proxy.resources }} - resources: {{ toYaml .Values.proxy.resources | nindent 10 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - ports: - - name: pp-proxy - port: {{ required "Need .Values.proxy.port to configure proxy" .Values.proxy.port }} - protocol: TCP - targetPort: {{ .Values.proxy.port }} - selector: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-servicemonitor.yaml deleted file mode 100644 index 67eb2216b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/pushprox-servicemonitor.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.serviceMonitor }}{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "pushprox.serviceMonitor.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.serviceMonitor.labels" . | nindent 4 }} -spec: - endpoints: {{include "pushProxy.serviceMonitor.endpoints" . | nindent 4 }} - jobLabel: component - podTargetLabels: - - component - - pushprox-exporter - namespaceSelector: - matchNames: - - {{ template "pushprox.namespace" . }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} ---- -{{- $selector := "" }} -{{- if not (kindIs "invalid" .Values.service) }} -{{- if not (kindIs "invalid" .Values.service.selector) }} -{{ if .Values.service.selector }} -{{- if .Values.clients.enabled }} -{{- required (printf "Cannot override .Values.service.selector=%s when .Values.clients.enabled=true" (toJson .Values.service.selector)) "" }} -{{- end }} -{{- $selector = (toYaml .Values.service.selector) }} -{{- end }} -{{- end }} -{{- end }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - ports: - - name: metrics - port: {{ required "Need .Values.metricsPort to configure client to listen to metrics at port" .Values.metricsPort}} - protocol: TCP - targetPort: {{ .Values.metricsPort }} - selector: {{ default (include "pushProxy.client.labels" .) $selector | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/validate-install-crd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/validate-install-crd.yaml deleted file mode 100644 index 16abc2fa83..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/validate-install-crd.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -# {{- $found := dict -}} -# {{- set $found "monitoring.coreos.com/v1/ServiceMonitor" false -}} -# {{- range .Capabilities.APIVersions -}} -# {{- if hasKey $found (toString .) -}} -# {{- set $found (toString .) true -}} -# {{- end -}} -# {{- end -}} -# {{- range $_, $exists := $found -}} -# {{- if (eq $exists false) -}} -# {{- required "Required CRDs are missing. Please install Prometheus Operator CRDs before installing this chart." "" -}} -# {{- end -}} -# {{- end -}} -#{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/validate-psp-install.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/values.yaml deleted file mode 100644 index 1e076041b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedKubelet/values.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# Default values for rancher-pushprox. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Default image containing both the proxy and the client was generated from the following Dockerfile -# https://github.com/prometheus-community/PushProx/blob/eeadbe766641699129920ccfaaaa30a85c67fe81/Dockerfile#L1-L15 - -# Configuration - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - seLinux: - enabled: false - -# A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. -# -# For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches -# any of the semver constraints provided as keys on the map. -# -# On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. -# -# If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. -# -# Notes: -# - On running a helm template, Helm generally assumes the kubeVersion is v1.20.0 -# - On running a helm install --dry-run, the correct kubeVersion should be chosen. -kubeVersionOverrides: [] -# - constraint: "< 1.21" -# values: -# metricsPort: 10252 -# clients: -# https: -# enabled: false -# insecureSkipVerify: false -# useServiceAccountCredentials: false - -namespaceOverride: "" - -# The component that is being monitored (i.e. etcd) -component: "component" - -# The port containing the metrics that need to be scraped -metricsPort: 2739 - -# Configure ServiceMonitor that monitors metrics from the metricsPort endpoint -serviceMonitor: - enabled: true - # A list of endpoints that will be added to the ServiceMonitor based on the Endpoint spec - # Source: https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint - # By default, proxyUrl and params._scheme will be overridden based on other values - endpoints: - - port: metrics - -# Configure Service that grabs scrape targets -service: - # The selector that is used to populate the Service's Endpoints object. - # The chart will error out on rendering templating if .Values.clients.enabled is set alongside this field, - # since it is expected that this service should point to the PushProx Clients Daemonset / Deployment - selector: {} - -clients: - enabled: true - # The port which the PushProx client will post PushProx metrics to - port: 9369 - # If unset, this will default to the URL for the proxy service: http://pushprox-{{component}}-proxy.{{namepsace}}.svc.cluster.local:{{proxy.port}} - # Should be modified if the clients are being deployed outside the cluster where the proxy rests, otherwise leave it null - proxyUrl: "" - # If set to true, the client will forward any requests from the host IP to 127.0.0.1 - # It will only allow proxy requests to the metricsPort specified - useLocalhost: false - # Configuration for accessing metrics via HTTPS - https: - # Does the client require https to access the metrics? - enabled: false - # Does the client require requests be sent to http or https? - forceHTTPSScheme: false - # If set to true, the client will create a service account with adequate permissions and set a flag - # on the client to use the service account token provided by it to make authorized scrape requests - useServiceAccountCredentials: false - # Configuration for authentication to metrics via https endpoint - authenticationMethod: - # Reads token from defined file in container - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenFile: - enabled: false - bearerTokenFilePath: "/var/run/secrets/kubernetes.io/serviceaccount/token" - # Reads token from defined secret in namespace - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenSecret: - enabled: false - # Reads token from defined secret in namespace - authorization: - enabled: false - type: "bearer" - credentials: - key: "token" - optional: false - # If set to true, the client will disable SSL security checks - insecureSkipVerify: false - # Directory on host where necessary TLS cert and key to scrape metrics can be found - certDir: "" - # Filenames for files located in .Values.clients.https.certDir that correspond to TLS settings - certFile: "" - keyFile: "" - caCertFile: "" - # seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. - # Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. - seLinuxOptions: {} - - metrics: - # Whether the client should publish PushProx client-specific metrics to .Values.clients.port - enabled: false - - rbac: - # Additional permissions to provide to the ServiceAccount bound to the client - # This can be used to provide additional permissions for the client to scrape metrics from the k8s API - # Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true - additionalRules: [] - - # Resource limits - resources: {} - - # Options to select all nodes to deploy client DaemonSet on - nodeSelector: {} - tolerations: [] - affinity: {} - - image: - repository: rancher/pushprox-client - tag: v0.1.3-rancher2-client - command: ["pushprox-client"] - - copyCertsImage: - repository: rancher/mirrored-library-busybox - tag: 1.31.1 - - # The default intention of rancher-pushprox clients is to scrape hostNetwork metrics across all nodes. - # This can be used to scrape internal Kubernetes components or DaemonSets of hostNetwork Pods in - # situations where a cloud provider firewall prevents Pod-To-Host communication but not Pod-To-Pod. - # However, if the underlying hostNetwork Pod that is being scraped is managed by a Deployment, - # this advanced option enables users to deploy the client as a Deployment instead of a DaemonSet. - # If a user deploys this feature and the underlying Deployment's number of replicas changes, the user will - # be responsible for upgrading this chart accordingly to the right number of replicas. - deployment: - enabled: false - replicas: 0 - -proxy: - enabled: true - # The port through which PushProx clients will communicate to the proxy - port: 8080 - - # Resource limits - resources: {} - - # Options to select a node to run a single proxy deployment on - nodeSelector: {} - tolerations: [] - - image: - repository: rancher/pushprox-proxy - tag: v0.1.3-rancher2-proxy - command: ["pushprox-proxy"] diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/Chart.yaml deleted file mode 100644 index 998538325c..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/Chart.yaml +++ /dev/null @@ -1,14 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.29.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-pushprox -apiVersion: v1 -appVersion: 0.1.0 -description: Sets up a deployment of the PushProx proxy and a DaemonSet of PushProx - clients. -name: hardenedNodeExporter -type: application -version: 0.2.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/README.md deleted file mode 100644 index 345002f48a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# rancher-pushprox - -A Rancher chart based on Rancher [PushProx](https://github.com/rancher/PushProx) that sets up a Deployment of a PushProx proxy and a DaemonSet of PushProx clients on a Kubernetes cluster. - -Installs [rancher-pushprox](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-pushprox) to create PushProx clients that can access their host's network and register with a PushProx proxy. A [Prometheus Operator](https://github.com/coreos/prometheus-operator) ServiceMonitor CR is also included that is configured to scrape the metrics from each of the clients through the proxy. - -Using an instance of this chart is suitable for the following scenarios: -- You need to scrape metrics from a port that should not be accessible outside of the host (e.g. scraping `etcd` metrics in a hardened cluster) -- You need to scrape metrics on a host that are not exposed outside of 127.0.0.1 (e.g. scraping `kube-proxy` metrics) -- You need to scrape metrics through HTTPS using certs hosted directly on `hostPath` -- You need to scrape metrics from Kubernetes components that require authorization via a service account (e.g. permissions to make request to `/metrics`) -- You need to scrape metrics without access to cacerts (i.e. enable `insecureSkipVerify`) - -The clients and proxy are created based on a Rancher fork of the [prometheus-community/PushProx](https://github.com/prometheus-community/PushProx) project. - -## Upgrading to Kubernetes v1.25+ - -Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. - -As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `global.cattle.psp.enabled` set to `false` if it has been previously set to `true`. -​ -> **Note:** -> In this chart release, any previous field that was associated with any PSP resources have been removed in favor of a single global field: `global.cattle.psp.enabled`. - -> **Note:** -> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** -> -> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. - -Upon setting `global.cattle.psp.enabled` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. - -As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. - -## Configuration - -The following tables list the configurable parameters of the rancher-pushprox chart and their default values. - -### General - -#### Required -| Parameter | Description | Example | -| ----- | ----------- | ------ | -| `component` | The component that is being monitored | `kube-etcd` -| `metricsPort` | The port on the host that contains the metrics you want to scrape (e.g. `http://:/metrics`) | `2379` | -| `namespaceOverride` | The namespace to install the chart | `""` - -#### Optional -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `serviceMonitor.enabled` | Deploys a [Prometheus Operator](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor) ServiceMonitor CR that is configured to scrape metrics on the hosts that the clients are deployed on via the proxy. Also deploys a Service that points to all pods with the expected client name that exposes the `metricsPort` selected | `true` | -| `serviceMonitor.endpoints` | A list of endpoints that will be added to the ServiceMonitor based on the [Endpoint spec](https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint) | `[{port: metrics}]` | -| `service.selector` | The selector that is used to populate the Service's Endpoints object. The chart will error out on rendering templating if `.Values.clients.enabled` is set alongside this field, since it is expected that this service should point to the PushProx Clients Daemonset / Deployment | `{}` | -| `clients.enabled` | Deploys a DaemonSet of clients that are each capable of scraping endpoints on the hostNetwork it is deployed on | `true` | -| `clients.port` | The port where the client will publish PushProx client-specific metrics. If deploying multiple clients onto the same node, the clients should not have conflicting ports | `9369` | -| `clients.proxyUrl` | Overrides the default proxyUrl setting of `http://pushprox-{{ .Values.component }}-proxy.{{ . Release.Namespace }}.svc.cluster.local:{{ .Values.proxy.port }}"` with the `proxyUrl` specified | `""` | -| `clients.useLocalhost` | Sets a flag on each client deployment to redirect scrapes directed to `HOST_IP` to `127.0.0.1` | `false` | -| `clients.https.enabled` | Enables scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.forceHTTPSScheme` | Forces scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.useServiceAccountCredentials` | If set to true, the client will create a service account with permissions to scrape `/metrics` endpoint of Kubernetes components. The client will use the service account token provided to make authorized scrape requests to the Kubernetes API | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.enabled` | If set to true, the client will use service account credentials mounted at the configured path `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath`. This requires permissions to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath` | This is a volume mount on the pod with permissions to scrape `/metrics` endpoint of Kubernetes components | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | -| `clients.https.authenticationMethod.bearerTokenSecret.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.authorization.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components | `false` | -| `clients.https.authenticationMethod.authorization.type` | If set, the client will use this type of authorization in its client requests for metrics | `"bearer"` | -| `clients.https.authenticationMethod.authorization.credentials.key` | If set, the client will use this key in the secret created by `clients.https.useServiceAccountCredentials` for authorization in its client requests for metrics | `"token"` | -| `clients.https.authenticationMethod.authorization.credentials.optional` | If set to false, the client will fail if the key in the secret created by `clients.https.useServiceAccountCredentials` does not exist | `false` | -| `clients.https.insecureSkipVerify` | If set to true, the client will disable SSL security checks | `false` | -| `clients.https.certDir` | A `hostPath` where TLS certs can be found. This path is mounted as a volume on an `initContainer` which copies only the necessary files over to an EmptyDir volume used by each client. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.certFile` | The path to the TLS cert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.keyFile` | The path to the TLS key file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.caCertFile` | The path to the TLS cacert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.seLinuxOptions` | seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. | `""` | -| `clients.metrics.enabled` | Whether the client should publish PushProx client-specific metrics. | `false` | -| `clients.rbac.additionalRules` | Additional permissions to provide to the ServiceAccount bound to the client. This can be used to provide additional permissions for the client to scrape metrics from the k8s API. Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true | `[]` | -| `clients.deployment.enabled` | Deploys the client as a Deployment (generally used if the underlying hostNetwork Pod that is being scraped is managed by a Deployment) | `false` | -| `clients.deployment.replicas` | The number of pods the Deployment has, it should match the number of pod the hostNetwork Deployment has. Required and only used if `client.deployment.enable` is set | `0` | -| `clients.deployment.affinity` | The affinity rules that allocate the pod to the node in which the hostNetwork Deployment's pods run. Required and only used if `client.deployment.enable` is set | `{}` | -| `clients.resources` | Set resource limits and requests for the client container | `{}` | -| `clients.nodeSelector` | Select which nodes to deploy the clients on | `{}` | -| `clients.tolerations` | Specify tolerations for clients | `[]` | -| `proxy.enabled` | Deploys the proxy that each client will register with | `true` | -| `proxy.port` | The port exposed by the proxy that each client will register with to allow metrics to be scraped from the host | `8080` | -| `proxy.resources` | Set resource limits and requests for the proxy container | `{}` | -| `proxy.nodeSelector` | Select which nodes the proxy can be deployed on | `{}` | -| `proxy.tolerations` | Specify tolerations (if necessary) to allow the proxy to be deployed on the selected node | `[]` | -| `kubeVersionOverrides` | A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches any of the semver constraints provided as keys on the map. On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. | `[]` - -*Tip: The filepaths set in `clients.https.File` can include wildcard characters*. - -See [rancher-monitoring](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-monitoring) for examples of how this chart can be used. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/_helpers.tpl deleted file mode 100644 index 8e651dccfd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/_helpers.tpl +++ /dev/null @@ -1,166 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# General - -{{- define "applyKubeVersionOverrides" -}} -{{- $overrides := dict -}} -{{- range $override := .Values.kubeVersionOverrides -}} -{{- if semverCompare $override.constraint $.Capabilities.KubeVersion.Version -}} -{{- $_ := mergeOverwrite $overrides $override.values -}} -{{- end -}} -{{- end -}} -{{- $_ := mergeOverwrite .Values $overrides -}} -{{- end -}} - -{{- define "pushprox.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{- define "pushProxy.commonLabels" -}} -release: {{ .Release.Name }} -component: {{ .Values.component | quote }} -provider: kubernetes -{{- end -}} - -{{- define "pushProxy.proxyUrl" -}} -{{- $_ := (required "Template requires either .Values.proxy.port or .Values.client.proxyUrl to set proxyUrl for client" (or .Values.clients.proxyUrl .Values.proxy.port)) -}} -{{- if .Values.clients.proxyUrl -}} -{{ printf "%s" .Values.clients.proxyUrl }} -{{- else -}} -{{ printf "http://%s.%s.svc:%d" (include "pushProxy.proxy.name" .) (include "pushprox.namespace" .) (int .Values.proxy.port) }} -{{- end -}}{{- end -}} - -# Client - -{{- define "pushProxy.client.name" -}} -{{- printf "pushprox-%s-client" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.serviceAccountTokenName" -}} -{{- printf "pushprox-%s-client-service-account-token" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.labels" -}} -k8s-app: {{ template "pushProxy.client.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# Proxy - -{{- define "pushProxy.proxy.name" -}} -{{- printf "pushprox-%s-proxy" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.proxy.labels" -}} -k8s-app: {{ template "pushProxy.proxy.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# ServiceMonitor - -{{- define "pushprox.serviceMonitor.name" -}} -{{- printf "%s-%s" .Release.Name (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.labels" -}} -app: {{ template "pushprox.serviceMonitor.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.endpoints" -}} -{{- $proxyURL := (include "pushProxy.proxyUrl" .) -}} -{{- $useHTTPS := .Values.clients.https.enabled -}} -{{- $forceHTTPSScheme := .Values.clients.https.forceHTTPSScheme -}} -{{- $insecureSkipVerify := .Values.clients.https.insecureSkipVerify -}} -{{- $useServiceAccountCredentials := .Values.clients.https.useServiceAccountCredentials -}} -{{- $serviceAccountTokenName := (include "pushProxy.client.serviceAccountTokenName" . ) -}} -{{- $metricRelabelings := list }} -{{- $endpoints := .Values.serviceMonitor.endpoints }} -{{- range $endpoints }} -{{- if $.Values.proxy.enabled }} -{{- $_ := set . "proxyUrl" $proxyURL }} -{{- end }} -{{- $clusterIdRelabel := dict }} -{{- if $.Values.global.cattle.clusterId }} -{{- $_ := set $clusterIdRelabel "action" "replace" }} -{{- $_ := set $clusterIdRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterIdRelabel "targetLabel" "cluster_id" }} -{{- $_ := set $clusterIdRelabel "replacement" $.Values.global.cattle.clusterId }} -{{- end }} -{{- $clusterNameRelabel := dict }} -{{- if $.Values.global.cattle.clusterName }} -{{- $_ := set $clusterNameRelabel "action" "replace" }} -{{- $_ := set $clusterNameRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterNameRelabel "targetLabel" "cluster_name" }} -{{- $_ := set $clusterNameRelabel "replacement" $.Values.global.cattle.clusterName }} -{{- end }} -{{- $metricRelabelings := gt (len (keys $clusterNameRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterNameRelabel)) ($metricRelabelings) }} -{{- $metricRelabelings := gt (len (keys $clusterIdRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterIdRelabel)) ($metricRelabelings) }} -{{- if not (empty $metricRelabelings) }} -{{- $_ := set . "metricRelabelings" ($metricRelabelings)}} -{{- end }} -{{- if $forceHTTPSScheme -}} -{{- $_ := set . "scheme" "https" }} -{{- end -}} -{{- if $useHTTPS -}} -{{- if (hasKey . "params") }} -{{- $_ := set (get . "params") "_scheme" (list "https") }} -{{- else }} -{{- $_ := set . "params" (dict "_scheme" (list "https")) }} -{{- end }} -{{- end }} -{{- if (hasKey . "tlsConfig") }} -{{- $_ := set (get . "tlsConfig") "insecureSkipVerify" $insecureSkipVerify }} -{{- else }} -{{- $_ := set . "tlsConfig" (dict "insecureSkipVerify" $insecureSkipVerify) }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenFile.enabled }} -{{- $_ := set . "bearerTokenFile" $.Values.clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenSecret.enabled }} -{{- $_ := set . "bearerTokenSecret" $serviceAccountTokenName }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.authorization.enabled }} -{{- if (hasKey . "authorization") }} -{{- $_ := set (get . "authorization") "type" $.Values.clients.https.authenticationMethod.authorization.type }} -{{- $_ := set (get . "authorization") "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional) }} -{{- else }} -{{- $_ := set . "authorization" (dict "type" $.Values.clients.https.authenticationMethod.authorization.type) }} -{{- $_ := set . "authorization" (dict "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional)) }} -{{- end }} -{{- end }} -{{- end }} -{{- toYaml $endpoints }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-clients-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-clients-rbac.yaml deleted file mode 100644 index a8e27c3735..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-clients-rbac.yaml +++ /dev/null @@ -1,97 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.client.name" . }} -{{- end }} -{{- if and .Values.clients.https.enabled .Values.clients.https.useServiceAccountCredentials }} -- nonResourceURLs: ["/metrics"] - verbs: ["get"] -{{- if .Values.clients.rbac.additionalRules }} -{{ toYaml .Values.clients.rbac.additionalRules }} -{{- end }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.client.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} ---- -{{- if .Values.clients.https.useServiceAccountCredentials }} -apiVersion: v1 -kind: Secret -type: kubernetes.io/service-account-token -metadata: - name: {{ template "pushProxy.client.serviceAccountTokenName" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - annotations: - kubernetes.io/service-account.name: {{ template "pushProxy.client.name" . }} -{{- end }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: true - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 6 }} -{{- end }} - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - - 'emptyDir' - - 'hostPath' - allowedHostPaths: - - pathPrefix: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - readOnly: true -{{- end }} -{{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-clients.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-clients.yaml deleted file mode 100644 index e8fcfb3883..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-clients.yaml +++ /dev/null @@ -1,157 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: apps/v1 -{{- if .Values.clients.deployment.enabled }} -kind: Deployment -{{- else }} -kind: DaemonSet -{{- end }} -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - pushprox-exporter: "client" -spec: - {{- if .Values.clients.deployment.enabled }} - replicas: {{ .Values.clients.deployment.replicas }} - {{- end }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.client.labels" . | nindent 8 }} - spec: - {{- if .Values.clients.affinity }} - affinity: {{ toYaml .Values.clients.affinity | nindent 8 }} - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.clients.nodeSelector }} -{{ toYaml .Values.clients.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.clients.tolerations }} -{{ toYaml .Values.clients.tolerations | indent 8 }} -{{- end }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - serviceAccountName: {{ template "pushProxy.client.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-client - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - {{- range .Values.clients.command }} - - {{ . | quote }} - {{- end }} - args: - - --fqdn=$(HOST_IP) - - --proxy-url=$(PROXY_URL) - {{- if .Values.clients.metrics.enabled }} - - --metrics-addr=$(PORT) - {{- end }} - - --allow-port={{ required "Need .Values.metricsPort to configure client to be allowed to scrape metrics at port" .Values.metricsPort}} - {{- if .Values.clients.useLocalhost }} - - --use-localhost - {{- end }} - {{- if .Values.clients.https.enabled }} - {{- if .Values.clients.https.insecureSkipVerify }} - - --insecure-skip-verify - {{- end }} - {{- if .Values.clients.https.useServiceAccountCredentials }} - - --token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- end }} - {{- if .Values.clients.https.certDir }} - - --tls.cert=/etc/ssl/push-proxy/push-proxy.pem - - --tls.key=/etc/ssl/push-proxy/push-proxy-key.pem - - --tls.cacert=/etc/ssl/push-proxy/push-proxy-ca-cert.pem - {{- end }} - {{- end }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if .Values.clients.metrics.enabled }} - - name: PORT - value: :{{ .Values.clients.port }} - {{- end }} - - name: PROXY_URL - value: {{ template "pushProxy.proxyUrl" . }} - securityContext: - runAsNonRoot: true - runAsUser: 1000 - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - volumeMounts: - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - {{- end }} - {{- if .Values.clients.resources }} - resources: {{ toYaml .Values.clients.resources | nindent 10 }} - {{- end }} - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - initContainers: - - name: copy-certs - image: {{ template "system_default_registry" . }}{{ .Values.clients.copyCertsImage.repository }}:{{ .Values.clients.copyCertsImage.tag }} - command: - - sh - - -c - - | - echo "Searching for files to copy within the source volume" - echo "cert: ${CERT_FILE_NAME}" - echo "key: ${KEY_FILE_NAME}" - echo "cacert: ${CACERT_FILE_NAME}" - - CERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CERT_FILE_NAME}" | sort -r | head -n 1) - KEY_FILE_SOURCE=$(find /etc/source/ -type f -name "${KEY_FILE_NAME}" | sort -r | head -n 1) - CACERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CACERT_FILE_NAME}" | sort -r | head -n 1) - - test -z ${CERT_FILE_SOURCE} && echo "Failed to find cert file" && exit 1 - test -z ${KEY_FILE_SOURCE} && echo "Failed to find key file" && exit 1 - test -z ${CACERT_FILE_SOURCE} && echo "Failed to find cacert file" && exit 1 - - echo "Copying cert file from $CERT_FILE_SOURCE to $CERT_FILE_TARGET" - cp $CERT_FILE_SOURCE $CERT_FILE_TARGET || exit 1 - chmod 444 $CERT_FILE_TARGET || exit 1 - - echo "Copying key file from $KEY_FILE_SOURCE to $KEY_FILE_TARGET" - cp $KEY_FILE_SOURCE $KEY_FILE_TARGET || exit 1 - chmod 444 $KEY_FILE_TARGET || exit 1 - - echo "Copying cacert file from $CACERT_FILE_SOURCE to $CACERT_FILE_TARGET" - cp $CACERT_FILE_SOURCE $CACERT_FILE_TARGET || exit 1 - chmod 444 $CACERT_FILE_TARGET || exit 1 - env: - - name: CERT_FILE_NAME - value: {{ required "Need a TLS cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.certFile }} - - name: KEY_FILE_NAME - value: {{ required "Need a TLS key file for scraping metrics endpoint over HTTPs" .Values.clients.https.keyFile }} - - name: CACERT_FILE_NAME - value: {{ required "Need a TLS CA cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.caCertFile }} - - name: CERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy.pem - - name: KEY_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-key.pem - - name: CACERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-ca-cert.pem - securityContext: - runAsNonRoot: false -{{- if and .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 12 }} -{{- end }} - volumeMounts: - - name: metrics-cert-dir-source - mountPath: /etc/source - readOnly: true - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - volumes: - - name: metrics-cert-dir-source - hostPath: - path: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - - name: metrics-cert-dir - emptyDir: {} - {{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-proxy-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-proxy-rbac.yaml deleted file mode 100644 index eefe609058..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-proxy-rbac.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.proxy.name" . }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.proxy.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- end }}{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-proxy.yaml deleted file mode 100644 index 723bbd6c00..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-proxy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} - pushprox-exporter: "proxy" -spec: - selector: - matchLabels: {{ include "pushProxy.proxy.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.proxy.labels" . | nindent 8 }} - spec: - securityContext: - runAsNonRoot: true - runAsUser: 1000 - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.proxy.nodeSelector }} -{{ toYaml .Values.proxy.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.proxy.tolerations }} -{{ toYaml .Values.proxy.tolerations | indent 8 }} -{{- end }} - serviceAccountName: {{ template "pushProxy.proxy.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-proxy - image: {{ template "system_default_registry" . }}{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag }} - command: - {{- range .Values.proxy.command }} - - {{ . | quote }} - {{- end }} - {{- if .Values.proxy.resources }} - resources: {{ toYaml .Values.proxy.resources | nindent 10 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - ports: - - name: pp-proxy - port: {{ required "Need .Values.proxy.port to configure proxy" .Values.proxy.port }} - protocol: TCP - targetPort: {{ .Values.proxy.port }} - selector: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-servicemonitor.yaml deleted file mode 100644 index 67eb2216b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/pushprox-servicemonitor.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.serviceMonitor }}{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "pushprox.serviceMonitor.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.serviceMonitor.labels" . | nindent 4 }} -spec: - endpoints: {{include "pushProxy.serviceMonitor.endpoints" . | nindent 4 }} - jobLabel: component - podTargetLabels: - - component - - pushprox-exporter - namespaceSelector: - matchNames: - - {{ template "pushprox.namespace" . }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} ---- -{{- $selector := "" }} -{{- if not (kindIs "invalid" .Values.service) }} -{{- if not (kindIs "invalid" .Values.service.selector) }} -{{ if .Values.service.selector }} -{{- if .Values.clients.enabled }} -{{- required (printf "Cannot override .Values.service.selector=%s when .Values.clients.enabled=true" (toJson .Values.service.selector)) "" }} -{{- end }} -{{- $selector = (toYaml .Values.service.selector) }} -{{- end }} -{{- end }} -{{- end }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - ports: - - name: metrics - port: {{ required "Need .Values.metricsPort to configure client to listen to metrics at port" .Values.metricsPort}} - protocol: TCP - targetPort: {{ .Values.metricsPort }} - selector: {{ default (include "pushProxy.client.labels" .) $selector | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/validate-install-crd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/validate-install-crd.yaml deleted file mode 100644 index 16abc2fa83..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/validate-install-crd.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -# {{- $found := dict -}} -# {{- set $found "monitoring.coreos.com/v1/ServiceMonitor" false -}} -# {{- range .Capabilities.APIVersions -}} -# {{- if hasKey $found (toString .) -}} -# {{- set $found (toString .) true -}} -# {{- end -}} -# {{- end -}} -# {{- range $_, $exists := $found -}} -# {{- if (eq $exists false) -}} -# {{- required "Required CRDs are missing. Please install Prometheus Operator CRDs before installing this chart." "" -}} -# {{- end -}} -# {{- end -}} -#{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/validate-psp-install.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/values.yaml deleted file mode 100644 index 1e076041b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/hardenedNodeExporter/values.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# Default values for rancher-pushprox. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Default image containing both the proxy and the client was generated from the following Dockerfile -# https://github.com/prometheus-community/PushProx/blob/eeadbe766641699129920ccfaaaa30a85c67fe81/Dockerfile#L1-L15 - -# Configuration - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - seLinux: - enabled: false - -# A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. -# -# For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches -# any of the semver constraints provided as keys on the map. -# -# On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. -# -# If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. -# -# Notes: -# - On running a helm template, Helm generally assumes the kubeVersion is v1.20.0 -# - On running a helm install --dry-run, the correct kubeVersion should be chosen. -kubeVersionOverrides: [] -# - constraint: "< 1.21" -# values: -# metricsPort: 10252 -# clients: -# https: -# enabled: false -# insecureSkipVerify: false -# useServiceAccountCredentials: false - -namespaceOverride: "" - -# The component that is being monitored (i.e. etcd) -component: "component" - -# The port containing the metrics that need to be scraped -metricsPort: 2739 - -# Configure ServiceMonitor that monitors metrics from the metricsPort endpoint -serviceMonitor: - enabled: true - # A list of endpoints that will be added to the ServiceMonitor based on the Endpoint spec - # Source: https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint - # By default, proxyUrl and params._scheme will be overridden based on other values - endpoints: - - port: metrics - -# Configure Service that grabs scrape targets -service: - # The selector that is used to populate the Service's Endpoints object. - # The chart will error out on rendering templating if .Values.clients.enabled is set alongside this field, - # since it is expected that this service should point to the PushProx Clients Daemonset / Deployment - selector: {} - -clients: - enabled: true - # The port which the PushProx client will post PushProx metrics to - port: 9369 - # If unset, this will default to the URL for the proxy service: http://pushprox-{{component}}-proxy.{{namepsace}}.svc.cluster.local:{{proxy.port}} - # Should be modified if the clients are being deployed outside the cluster where the proxy rests, otherwise leave it null - proxyUrl: "" - # If set to true, the client will forward any requests from the host IP to 127.0.0.1 - # It will only allow proxy requests to the metricsPort specified - useLocalhost: false - # Configuration for accessing metrics via HTTPS - https: - # Does the client require https to access the metrics? - enabled: false - # Does the client require requests be sent to http or https? - forceHTTPSScheme: false - # If set to true, the client will create a service account with adequate permissions and set a flag - # on the client to use the service account token provided by it to make authorized scrape requests - useServiceAccountCredentials: false - # Configuration for authentication to metrics via https endpoint - authenticationMethod: - # Reads token from defined file in container - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenFile: - enabled: false - bearerTokenFilePath: "/var/run/secrets/kubernetes.io/serviceaccount/token" - # Reads token from defined secret in namespace - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenSecret: - enabled: false - # Reads token from defined secret in namespace - authorization: - enabled: false - type: "bearer" - credentials: - key: "token" - optional: false - # If set to true, the client will disable SSL security checks - insecureSkipVerify: false - # Directory on host where necessary TLS cert and key to scrape metrics can be found - certDir: "" - # Filenames for files located in .Values.clients.https.certDir that correspond to TLS settings - certFile: "" - keyFile: "" - caCertFile: "" - # seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. - # Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. - seLinuxOptions: {} - - metrics: - # Whether the client should publish PushProx client-specific metrics to .Values.clients.port - enabled: false - - rbac: - # Additional permissions to provide to the ServiceAccount bound to the client - # This can be used to provide additional permissions for the client to scrape metrics from the k8s API - # Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true - additionalRules: [] - - # Resource limits - resources: {} - - # Options to select all nodes to deploy client DaemonSet on - nodeSelector: {} - tolerations: [] - affinity: {} - - image: - repository: rancher/pushprox-client - tag: v0.1.3-rancher2-client - command: ["pushprox-client"] - - copyCertsImage: - repository: rancher/mirrored-library-busybox - tag: 1.31.1 - - # The default intention of rancher-pushprox clients is to scrape hostNetwork metrics across all nodes. - # This can be used to scrape internal Kubernetes components or DaemonSets of hostNetwork Pods in - # situations where a cloud provider firewall prevents Pod-To-Host communication but not Pod-To-Pod. - # However, if the underlying hostNetwork Pod that is being scraped is managed by a Deployment, - # this advanced option enables users to deploy the client as a Deployment instead of a DaemonSet. - # If a user deploys this feature and the underlying Deployment's number of replicas changes, the user will - # be responsible for upgrading this chart accordingly to the right number of replicas. - deployment: - enabled: false - replicas: 0 - -proxy: - enabled: true - # The port through which PushProx clients will communicate to the proxy - port: 8080 - - # Resource limits - resources: {} - - # Options to select a node to run a single proxy deployment on - nodeSelector: {} - tolerations: [] - - image: - repository: rancher/pushprox-proxy - tag: v0.1.3-rancher2-proxy - command: ["pushprox-proxy"] diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/Chart.yaml deleted file mode 100644 index fd29caa7f6..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/Chart.yaml +++ /dev/null @@ -1,14 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.29.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-pushprox -apiVersion: v1 -appVersion: 0.1.0 -description: Sets up a deployment of the PushProx proxy and a DaemonSet of PushProx - clients. -name: k3sServer -type: application -version: 0.2.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/README.md deleted file mode 100644 index 345002f48a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# rancher-pushprox - -A Rancher chart based on Rancher [PushProx](https://github.com/rancher/PushProx) that sets up a Deployment of a PushProx proxy and a DaemonSet of PushProx clients on a Kubernetes cluster. - -Installs [rancher-pushprox](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-pushprox) to create PushProx clients that can access their host's network and register with a PushProx proxy. A [Prometheus Operator](https://github.com/coreos/prometheus-operator) ServiceMonitor CR is also included that is configured to scrape the metrics from each of the clients through the proxy. - -Using an instance of this chart is suitable for the following scenarios: -- You need to scrape metrics from a port that should not be accessible outside of the host (e.g. scraping `etcd` metrics in a hardened cluster) -- You need to scrape metrics on a host that are not exposed outside of 127.0.0.1 (e.g. scraping `kube-proxy` metrics) -- You need to scrape metrics through HTTPS using certs hosted directly on `hostPath` -- You need to scrape metrics from Kubernetes components that require authorization via a service account (e.g. permissions to make request to `/metrics`) -- You need to scrape metrics without access to cacerts (i.e. enable `insecureSkipVerify`) - -The clients and proxy are created based on a Rancher fork of the [prometheus-community/PushProx](https://github.com/prometheus-community/PushProx) project. - -## Upgrading to Kubernetes v1.25+ - -Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. - -As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `global.cattle.psp.enabled` set to `false` if it has been previously set to `true`. -​ -> **Note:** -> In this chart release, any previous field that was associated with any PSP resources have been removed in favor of a single global field: `global.cattle.psp.enabled`. - -> **Note:** -> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** -> -> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. - -Upon setting `global.cattle.psp.enabled` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. - -As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. - -## Configuration - -The following tables list the configurable parameters of the rancher-pushprox chart and their default values. - -### General - -#### Required -| Parameter | Description | Example | -| ----- | ----------- | ------ | -| `component` | The component that is being monitored | `kube-etcd` -| `metricsPort` | The port on the host that contains the metrics you want to scrape (e.g. `http://:/metrics`) | `2379` | -| `namespaceOverride` | The namespace to install the chart | `""` - -#### Optional -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `serviceMonitor.enabled` | Deploys a [Prometheus Operator](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor) ServiceMonitor CR that is configured to scrape metrics on the hosts that the clients are deployed on via the proxy. Also deploys a Service that points to all pods with the expected client name that exposes the `metricsPort` selected | `true` | -| `serviceMonitor.endpoints` | A list of endpoints that will be added to the ServiceMonitor based on the [Endpoint spec](https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint) | `[{port: metrics}]` | -| `service.selector` | The selector that is used to populate the Service's Endpoints object. The chart will error out on rendering templating if `.Values.clients.enabled` is set alongside this field, since it is expected that this service should point to the PushProx Clients Daemonset / Deployment | `{}` | -| `clients.enabled` | Deploys a DaemonSet of clients that are each capable of scraping endpoints on the hostNetwork it is deployed on | `true` | -| `clients.port` | The port where the client will publish PushProx client-specific metrics. If deploying multiple clients onto the same node, the clients should not have conflicting ports | `9369` | -| `clients.proxyUrl` | Overrides the default proxyUrl setting of `http://pushprox-{{ .Values.component }}-proxy.{{ . Release.Namespace }}.svc.cluster.local:{{ .Values.proxy.port }}"` with the `proxyUrl` specified | `""` | -| `clients.useLocalhost` | Sets a flag on each client deployment to redirect scrapes directed to `HOST_IP` to `127.0.0.1` | `false` | -| `clients.https.enabled` | Enables scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.forceHTTPSScheme` | Forces scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.useServiceAccountCredentials` | If set to true, the client will create a service account with permissions to scrape `/metrics` endpoint of Kubernetes components. The client will use the service account token provided to make authorized scrape requests to the Kubernetes API | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.enabled` | If set to true, the client will use service account credentials mounted at the configured path `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath`. This requires permissions to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath` | This is a volume mount on the pod with permissions to scrape `/metrics` endpoint of Kubernetes components | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | -| `clients.https.authenticationMethod.bearerTokenSecret.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.authorization.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components | `false` | -| `clients.https.authenticationMethod.authorization.type` | If set, the client will use this type of authorization in its client requests for metrics | `"bearer"` | -| `clients.https.authenticationMethod.authorization.credentials.key` | If set, the client will use this key in the secret created by `clients.https.useServiceAccountCredentials` for authorization in its client requests for metrics | `"token"` | -| `clients.https.authenticationMethod.authorization.credentials.optional` | If set to false, the client will fail if the key in the secret created by `clients.https.useServiceAccountCredentials` does not exist | `false` | -| `clients.https.insecureSkipVerify` | If set to true, the client will disable SSL security checks | `false` | -| `clients.https.certDir` | A `hostPath` where TLS certs can be found. This path is mounted as a volume on an `initContainer` which copies only the necessary files over to an EmptyDir volume used by each client. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.certFile` | The path to the TLS cert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.keyFile` | The path to the TLS key file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.caCertFile` | The path to the TLS cacert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.seLinuxOptions` | seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. | `""` | -| `clients.metrics.enabled` | Whether the client should publish PushProx client-specific metrics. | `false` | -| `clients.rbac.additionalRules` | Additional permissions to provide to the ServiceAccount bound to the client. This can be used to provide additional permissions for the client to scrape metrics from the k8s API. Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true | `[]` | -| `clients.deployment.enabled` | Deploys the client as a Deployment (generally used if the underlying hostNetwork Pod that is being scraped is managed by a Deployment) | `false` | -| `clients.deployment.replicas` | The number of pods the Deployment has, it should match the number of pod the hostNetwork Deployment has. Required and only used if `client.deployment.enable` is set | `0` | -| `clients.deployment.affinity` | The affinity rules that allocate the pod to the node in which the hostNetwork Deployment's pods run. Required and only used if `client.deployment.enable` is set | `{}` | -| `clients.resources` | Set resource limits and requests for the client container | `{}` | -| `clients.nodeSelector` | Select which nodes to deploy the clients on | `{}` | -| `clients.tolerations` | Specify tolerations for clients | `[]` | -| `proxy.enabled` | Deploys the proxy that each client will register with | `true` | -| `proxy.port` | The port exposed by the proxy that each client will register with to allow metrics to be scraped from the host | `8080` | -| `proxy.resources` | Set resource limits and requests for the proxy container | `{}` | -| `proxy.nodeSelector` | Select which nodes the proxy can be deployed on | `{}` | -| `proxy.tolerations` | Specify tolerations (if necessary) to allow the proxy to be deployed on the selected node | `[]` | -| `kubeVersionOverrides` | A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches any of the semver constraints provided as keys on the map. On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. | `[]` - -*Tip: The filepaths set in `clients.https.File` can include wildcard characters*. - -See [rancher-monitoring](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-monitoring) for examples of how this chart can be used. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/_helpers.tpl deleted file mode 100644 index 8e651dccfd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/_helpers.tpl +++ /dev/null @@ -1,166 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# General - -{{- define "applyKubeVersionOverrides" -}} -{{- $overrides := dict -}} -{{- range $override := .Values.kubeVersionOverrides -}} -{{- if semverCompare $override.constraint $.Capabilities.KubeVersion.Version -}} -{{- $_ := mergeOverwrite $overrides $override.values -}} -{{- end -}} -{{- end -}} -{{- $_ := mergeOverwrite .Values $overrides -}} -{{- end -}} - -{{- define "pushprox.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{- define "pushProxy.commonLabels" -}} -release: {{ .Release.Name }} -component: {{ .Values.component | quote }} -provider: kubernetes -{{- end -}} - -{{- define "pushProxy.proxyUrl" -}} -{{- $_ := (required "Template requires either .Values.proxy.port or .Values.client.proxyUrl to set proxyUrl for client" (or .Values.clients.proxyUrl .Values.proxy.port)) -}} -{{- if .Values.clients.proxyUrl -}} -{{ printf "%s" .Values.clients.proxyUrl }} -{{- else -}} -{{ printf "http://%s.%s.svc:%d" (include "pushProxy.proxy.name" .) (include "pushprox.namespace" .) (int .Values.proxy.port) }} -{{- end -}}{{- end -}} - -# Client - -{{- define "pushProxy.client.name" -}} -{{- printf "pushprox-%s-client" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.serviceAccountTokenName" -}} -{{- printf "pushprox-%s-client-service-account-token" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.labels" -}} -k8s-app: {{ template "pushProxy.client.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# Proxy - -{{- define "pushProxy.proxy.name" -}} -{{- printf "pushprox-%s-proxy" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.proxy.labels" -}} -k8s-app: {{ template "pushProxy.proxy.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# ServiceMonitor - -{{- define "pushprox.serviceMonitor.name" -}} -{{- printf "%s-%s" .Release.Name (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.labels" -}} -app: {{ template "pushprox.serviceMonitor.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.endpoints" -}} -{{- $proxyURL := (include "pushProxy.proxyUrl" .) -}} -{{- $useHTTPS := .Values.clients.https.enabled -}} -{{- $forceHTTPSScheme := .Values.clients.https.forceHTTPSScheme -}} -{{- $insecureSkipVerify := .Values.clients.https.insecureSkipVerify -}} -{{- $useServiceAccountCredentials := .Values.clients.https.useServiceAccountCredentials -}} -{{- $serviceAccountTokenName := (include "pushProxy.client.serviceAccountTokenName" . ) -}} -{{- $metricRelabelings := list }} -{{- $endpoints := .Values.serviceMonitor.endpoints }} -{{- range $endpoints }} -{{- if $.Values.proxy.enabled }} -{{- $_ := set . "proxyUrl" $proxyURL }} -{{- end }} -{{- $clusterIdRelabel := dict }} -{{- if $.Values.global.cattle.clusterId }} -{{- $_ := set $clusterIdRelabel "action" "replace" }} -{{- $_ := set $clusterIdRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterIdRelabel "targetLabel" "cluster_id" }} -{{- $_ := set $clusterIdRelabel "replacement" $.Values.global.cattle.clusterId }} -{{- end }} -{{- $clusterNameRelabel := dict }} -{{- if $.Values.global.cattle.clusterName }} -{{- $_ := set $clusterNameRelabel "action" "replace" }} -{{- $_ := set $clusterNameRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterNameRelabel "targetLabel" "cluster_name" }} -{{- $_ := set $clusterNameRelabel "replacement" $.Values.global.cattle.clusterName }} -{{- end }} -{{- $metricRelabelings := gt (len (keys $clusterNameRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterNameRelabel)) ($metricRelabelings) }} -{{- $metricRelabelings := gt (len (keys $clusterIdRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterIdRelabel)) ($metricRelabelings) }} -{{- if not (empty $metricRelabelings) }} -{{- $_ := set . "metricRelabelings" ($metricRelabelings)}} -{{- end }} -{{- if $forceHTTPSScheme -}} -{{- $_ := set . "scheme" "https" }} -{{- end -}} -{{- if $useHTTPS -}} -{{- if (hasKey . "params") }} -{{- $_ := set (get . "params") "_scheme" (list "https") }} -{{- else }} -{{- $_ := set . "params" (dict "_scheme" (list "https")) }} -{{- end }} -{{- end }} -{{- if (hasKey . "tlsConfig") }} -{{- $_ := set (get . "tlsConfig") "insecureSkipVerify" $insecureSkipVerify }} -{{- else }} -{{- $_ := set . "tlsConfig" (dict "insecureSkipVerify" $insecureSkipVerify) }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenFile.enabled }} -{{- $_ := set . "bearerTokenFile" $.Values.clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenSecret.enabled }} -{{- $_ := set . "bearerTokenSecret" $serviceAccountTokenName }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.authorization.enabled }} -{{- if (hasKey . "authorization") }} -{{- $_ := set (get . "authorization") "type" $.Values.clients.https.authenticationMethod.authorization.type }} -{{- $_ := set (get . "authorization") "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional) }} -{{- else }} -{{- $_ := set . "authorization" (dict "type" $.Values.clients.https.authenticationMethod.authorization.type) }} -{{- $_ := set . "authorization" (dict "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional)) }} -{{- end }} -{{- end }} -{{- end }} -{{- toYaml $endpoints }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-clients-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-clients-rbac.yaml deleted file mode 100644 index a8e27c3735..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-clients-rbac.yaml +++ /dev/null @@ -1,97 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.client.name" . }} -{{- end }} -{{- if and .Values.clients.https.enabled .Values.clients.https.useServiceAccountCredentials }} -- nonResourceURLs: ["/metrics"] - verbs: ["get"] -{{- if .Values.clients.rbac.additionalRules }} -{{ toYaml .Values.clients.rbac.additionalRules }} -{{- end }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.client.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} ---- -{{- if .Values.clients.https.useServiceAccountCredentials }} -apiVersion: v1 -kind: Secret -type: kubernetes.io/service-account-token -metadata: - name: {{ template "pushProxy.client.serviceAccountTokenName" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - annotations: - kubernetes.io/service-account.name: {{ template "pushProxy.client.name" . }} -{{- end }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: true - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 6 }} -{{- end }} - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - - 'emptyDir' - - 'hostPath' - allowedHostPaths: - - pathPrefix: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - readOnly: true -{{- end }} -{{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-clients.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-clients.yaml deleted file mode 100644 index e8fcfb3883..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-clients.yaml +++ /dev/null @@ -1,157 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: apps/v1 -{{- if .Values.clients.deployment.enabled }} -kind: Deployment -{{- else }} -kind: DaemonSet -{{- end }} -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - pushprox-exporter: "client" -spec: - {{- if .Values.clients.deployment.enabled }} - replicas: {{ .Values.clients.deployment.replicas }} - {{- end }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.client.labels" . | nindent 8 }} - spec: - {{- if .Values.clients.affinity }} - affinity: {{ toYaml .Values.clients.affinity | nindent 8 }} - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.clients.nodeSelector }} -{{ toYaml .Values.clients.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.clients.tolerations }} -{{ toYaml .Values.clients.tolerations | indent 8 }} -{{- end }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - serviceAccountName: {{ template "pushProxy.client.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-client - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - {{- range .Values.clients.command }} - - {{ . | quote }} - {{- end }} - args: - - --fqdn=$(HOST_IP) - - --proxy-url=$(PROXY_URL) - {{- if .Values.clients.metrics.enabled }} - - --metrics-addr=$(PORT) - {{- end }} - - --allow-port={{ required "Need .Values.metricsPort to configure client to be allowed to scrape metrics at port" .Values.metricsPort}} - {{- if .Values.clients.useLocalhost }} - - --use-localhost - {{- end }} - {{- if .Values.clients.https.enabled }} - {{- if .Values.clients.https.insecureSkipVerify }} - - --insecure-skip-verify - {{- end }} - {{- if .Values.clients.https.useServiceAccountCredentials }} - - --token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- end }} - {{- if .Values.clients.https.certDir }} - - --tls.cert=/etc/ssl/push-proxy/push-proxy.pem - - --tls.key=/etc/ssl/push-proxy/push-proxy-key.pem - - --tls.cacert=/etc/ssl/push-proxy/push-proxy-ca-cert.pem - {{- end }} - {{- end }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if .Values.clients.metrics.enabled }} - - name: PORT - value: :{{ .Values.clients.port }} - {{- end }} - - name: PROXY_URL - value: {{ template "pushProxy.proxyUrl" . }} - securityContext: - runAsNonRoot: true - runAsUser: 1000 - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - volumeMounts: - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - {{- end }} - {{- if .Values.clients.resources }} - resources: {{ toYaml .Values.clients.resources | nindent 10 }} - {{- end }} - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - initContainers: - - name: copy-certs - image: {{ template "system_default_registry" . }}{{ .Values.clients.copyCertsImage.repository }}:{{ .Values.clients.copyCertsImage.tag }} - command: - - sh - - -c - - | - echo "Searching for files to copy within the source volume" - echo "cert: ${CERT_FILE_NAME}" - echo "key: ${KEY_FILE_NAME}" - echo "cacert: ${CACERT_FILE_NAME}" - - CERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CERT_FILE_NAME}" | sort -r | head -n 1) - KEY_FILE_SOURCE=$(find /etc/source/ -type f -name "${KEY_FILE_NAME}" | sort -r | head -n 1) - CACERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CACERT_FILE_NAME}" | sort -r | head -n 1) - - test -z ${CERT_FILE_SOURCE} && echo "Failed to find cert file" && exit 1 - test -z ${KEY_FILE_SOURCE} && echo "Failed to find key file" && exit 1 - test -z ${CACERT_FILE_SOURCE} && echo "Failed to find cacert file" && exit 1 - - echo "Copying cert file from $CERT_FILE_SOURCE to $CERT_FILE_TARGET" - cp $CERT_FILE_SOURCE $CERT_FILE_TARGET || exit 1 - chmod 444 $CERT_FILE_TARGET || exit 1 - - echo "Copying key file from $KEY_FILE_SOURCE to $KEY_FILE_TARGET" - cp $KEY_FILE_SOURCE $KEY_FILE_TARGET || exit 1 - chmod 444 $KEY_FILE_TARGET || exit 1 - - echo "Copying cacert file from $CACERT_FILE_SOURCE to $CACERT_FILE_TARGET" - cp $CACERT_FILE_SOURCE $CACERT_FILE_TARGET || exit 1 - chmod 444 $CACERT_FILE_TARGET || exit 1 - env: - - name: CERT_FILE_NAME - value: {{ required "Need a TLS cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.certFile }} - - name: KEY_FILE_NAME - value: {{ required "Need a TLS key file for scraping metrics endpoint over HTTPs" .Values.clients.https.keyFile }} - - name: CACERT_FILE_NAME - value: {{ required "Need a TLS CA cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.caCertFile }} - - name: CERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy.pem - - name: KEY_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-key.pem - - name: CACERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-ca-cert.pem - securityContext: - runAsNonRoot: false -{{- if and .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 12 }} -{{- end }} - volumeMounts: - - name: metrics-cert-dir-source - mountPath: /etc/source - readOnly: true - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - volumes: - - name: metrics-cert-dir-source - hostPath: - path: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - - name: metrics-cert-dir - emptyDir: {} - {{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-proxy-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-proxy-rbac.yaml deleted file mode 100644 index eefe609058..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-proxy-rbac.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.proxy.name" . }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.proxy.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- end }}{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-proxy.yaml deleted file mode 100644 index 723bbd6c00..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-proxy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} - pushprox-exporter: "proxy" -spec: - selector: - matchLabels: {{ include "pushProxy.proxy.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.proxy.labels" . | nindent 8 }} - spec: - securityContext: - runAsNonRoot: true - runAsUser: 1000 - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.proxy.nodeSelector }} -{{ toYaml .Values.proxy.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.proxy.tolerations }} -{{ toYaml .Values.proxy.tolerations | indent 8 }} -{{- end }} - serviceAccountName: {{ template "pushProxy.proxy.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-proxy - image: {{ template "system_default_registry" . }}{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag }} - command: - {{- range .Values.proxy.command }} - - {{ . | quote }} - {{- end }} - {{- if .Values.proxy.resources }} - resources: {{ toYaml .Values.proxy.resources | nindent 10 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - ports: - - name: pp-proxy - port: {{ required "Need .Values.proxy.port to configure proxy" .Values.proxy.port }} - protocol: TCP - targetPort: {{ .Values.proxy.port }} - selector: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-servicemonitor.yaml deleted file mode 100644 index 67eb2216b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/pushprox-servicemonitor.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.serviceMonitor }}{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "pushprox.serviceMonitor.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.serviceMonitor.labels" . | nindent 4 }} -spec: - endpoints: {{include "pushProxy.serviceMonitor.endpoints" . | nindent 4 }} - jobLabel: component - podTargetLabels: - - component - - pushprox-exporter - namespaceSelector: - matchNames: - - {{ template "pushprox.namespace" . }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} ---- -{{- $selector := "" }} -{{- if not (kindIs "invalid" .Values.service) }} -{{- if not (kindIs "invalid" .Values.service.selector) }} -{{ if .Values.service.selector }} -{{- if .Values.clients.enabled }} -{{- required (printf "Cannot override .Values.service.selector=%s when .Values.clients.enabled=true" (toJson .Values.service.selector)) "" }} -{{- end }} -{{- $selector = (toYaml .Values.service.selector) }} -{{- end }} -{{- end }} -{{- end }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - ports: - - name: metrics - port: {{ required "Need .Values.metricsPort to configure client to listen to metrics at port" .Values.metricsPort}} - protocol: TCP - targetPort: {{ .Values.metricsPort }} - selector: {{ default (include "pushProxy.client.labels" .) $selector | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/validate-install-crd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/validate-install-crd.yaml deleted file mode 100644 index 16abc2fa83..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/validate-install-crd.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -# {{- $found := dict -}} -# {{- set $found "monitoring.coreos.com/v1/ServiceMonitor" false -}} -# {{- range .Capabilities.APIVersions -}} -# {{- if hasKey $found (toString .) -}} -# {{- set $found (toString .) true -}} -# {{- end -}} -# {{- end -}} -# {{- range $_, $exists := $found -}} -# {{- if (eq $exists false) -}} -# {{- required "Required CRDs are missing. Please install Prometheus Operator CRDs before installing this chart." "" -}} -# {{- end -}} -# {{- end -}} -#{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/validate-psp-install.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/values.yaml deleted file mode 100644 index 1e076041b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/k3sServer/values.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# Default values for rancher-pushprox. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Default image containing both the proxy and the client was generated from the following Dockerfile -# https://github.com/prometheus-community/PushProx/blob/eeadbe766641699129920ccfaaaa30a85c67fe81/Dockerfile#L1-L15 - -# Configuration - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - seLinux: - enabled: false - -# A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. -# -# For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches -# any of the semver constraints provided as keys on the map. -# -# On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. -# -# If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. -# -# Notes: -# - On running a helm template, Helm generally assumes the kubeVersion is v1.20.0 -# - On running a helm install --dry-run, the correct kubeVersion should be chosen. -kubeVersionOverrides: [] -# - constraint: "< 1.21" -# values: -# metricsPort: 10252 -# clients: -# https: -# enabled: false -# insecureSkipVerify: false -# useServiceAccountCredentials: false - -namespaceOverride: "" - -# The component that is being monitored (i.e. etcd) -component: "component" - -# The port containing the metrics that need to be scraped -metricsPort: 2739 - -# Configure ServiceMonitor that monitors metrics from the metricsPort endpoint -serviceMonitor: - enabled: true - # A list of endpoints that will be added to the ServiceMonitor based on the Endpoint spec - # Source: https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint - # By default, proxyUrl and params._scheme will be overridden based on other values - endpoints: - - port: metrics - -# Configure Service that grabs scrape targets -service: - # The selector that is used to populate the Service's Endpoints object. - # The chart will error out on rendering templating if .Values.clients.enabled is set alongside this field, - # since it is expected that this service should point to the PushProx Clients Daemonset / Deployment - selector: {} - -clients: - enabled: true - # The port which the PushProx client will post PushProx metrics to - port: 9369 - # If unset, this will default to the URL for the proxy service: http://pushprox-{{component}}-proxy.{{namepsace}}.svc.cluster.local:{{proxy.port}} - # Should be modified if the clients are being deployed outside the cluster where the proxy rests, otherwise leave it null - proxyUrl: "" - # If set to true, the client will forward any requests from the host IP to 127.0.0.1 - # It will only allow proxy requests to the metricsPort specified - useLocalhost: false - # Configuration for accessing metrics via HTTPS - https: - # Does the client require https to access the metrics? - enabled: false - # Does the client require requests be sent to http or https? - forceHTTPSScheme: false - # If set to true, the client will create a service account with adequate permissions and set a flag - # on the client to use the service account token provided by it to make authorized scrape requests - useServiceAccountCredentials: false - # Configuration for authentication to metrics via https endpoint - authenticationMethod: - # Reads token from defined file in container - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenFile: - enabled: false - bearerTokenFilePath: "/var/run/secrets/kubernetes.io/serviceaccount/token" - # Reads token from defined secret in namespace - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenSecret: - enabled: false - # Reads token from defined secret in namespace - authorization: - enabled: false - type: "bearer" - credentials: - key: "token" - optional: false - # If set to true, the client will disable SSL security checks - insecureSkipVerify: false - # Directory on host where necessary TLS cert and key to scrape metrics can be found - certDir: "" - # Filenames for files located in .Values.clients.https.certDir that correspond to TLS settings - certFile: "" - keyFile: "" - caCertFile: "" - # seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. - # Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. - seLinuxOptions: {} - - metrics: - # Whether the client should publish PushProx client-specific metrics to .Values.clients.port - enabled: false - - rbac: - # Additional permissions to provide to the ServiceAccount bound to the client - # This can be used to provide additional permissions for the client to scrape metrics from the k8s API - # Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true - additionalRules: [] - - # Resource limits - resources: {} - - # Options to select all nodes to deploy client DaemonSet on - nodeSelector: {} - tolerations: [] - affinity: {} - - image: - repository: rancher/pushprox-client - tag: v0.1.3-rancher2-client - command: ["pushprox-client"] - - copyCertsImage: - repository: rancher/mirrored-library-busybox - tag: 1.31.1 - - # The default intention of rancher-pushprox clients is to scrape hostNetwork metrics across all nodes. - # This can be used to scrape internal Kubernetes components or DaemonSets of hostNetwork Pods in - # situations where a cloud provider firewall prevents Pod-To-Host communication but not Pod-To-Pod. - # However, if the underlying hostNetwork Pod that is being scraped is managed by a Deployment, - # this advanced option enables users to deploy the client as a Deployment instead of a DaemonSet. - # If a user deploys this feature and the underlying Deployment's number of replicas changes, the user will - # be responsible for upgrading this chart accordingly to the right number of replicas. - deployment: - enabled: false - replicas: 0 - -proxy: - enabled: true - # The port through which PushProx clients will communicate to the proxy - port: 8080 - - # Resource limits - resources: {} - - # Options to select a node to run a single proxy deployment on - nodeSelector: {} - tolerations: [] - - image: - repository: rancher/pushprox-proxy - tag: v0.1.3-rancher2-proxy - command: ["pushprox-proxy"] diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/.helmignore deleted file mode 100644 index f0c1319444..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/.helmignore +++ /dev/null @@ -1,21 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/Chart.yaml deleted file mode 100644 index e51e33010f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/Chart.yaml +++ /dev/null @@ -1,28 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.16.0-0 < 1.27.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-kube-state-metrics -apiVersion: v2 -appVersion: 2.9.2 -description: Install kube-state-metrics to generate and expose cluster-level metrics -home: https://github.com/kubernetes/kube-state-metrics/ -keywords: -- metric -- monitoring -- prometheus -- kubernetes -maintainers: -- email: tariq.ibrahim@mulesoft.com - name: tariq1890 -- email: manuel@rueg.eu - name: mrueg -- email: david@0xdc.me - name: dotdc -name: kube-state-metrics -sources: -- https://github.com/kubernetes/kube-state-metrics/ -type: application -version: 5.8.1 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/README.md deleted file mode 100644 index 843be89e69..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/README.md +++ /dev/null @@ -1,85 +0,0 @@ -# kube-state-metrics Helm Chart - -Installs the [kube-state-metrics agent](https://github.com/kubernetes/kube-state-metrics). - -## Get Repository Info - -```console -helm repo add prometheus-community https://prometheus-community.github.io/helm-charts -helm repo update -``` - -_See [helm repo](https://helm.sh/docs/helm/helm_repo/) for command documentation._ - - -## Install Chart - -```console -helm install [RELEASE_NAME] prometheus-community/kube-state-metrics [flags] -``` - -_See [configuration](#configuration) below._ - -_See [helm install](https://helm.sh/docs/helm/helm_install/) for command documentation._ - -## Uninstall Chart - -```console -helm uninstall [RELEASE_NAME] -``` - -This removes all the Kubernetes components associated with the chart and deletes the release. - -_See [helm uninstall](https://helm.sh/docs/helm/helm_uninstall/) for command documentation._ - -## Upgrading Chart - -```console -helm upgrade [RELEASE_NAME] prometheus-community/kube-state-metrics [flags] -``` - -_See [helm upgrade](https://helm.sh/docs/helm/helm_upgrade/) for command documentation._ - -### Migrating from stable/kube-state-metrics and kubernetes/kube-state-metrics - -You can upgrade in-place: - -1. [get repository info](#get-repository-info) -1. [upgrade](#upgrading-chart) your existing release name using the new chart repository - -## Upgrading to v3.0.0 - -v3.0.0 includes kube-state-metrics v2.0, see the [changelog](https://github.com/kubernetes/kube-state-metrics/blob/release-2.0/CHANGELOG.md) for major changes on the application-side. - -The upgraded chart now the following changes: - -* Dropped support for helm v2 (helm v3 or later is required) -* collectors key was renamed to resources -* namespace key was renamed to namespaces - -## Configuration - -See [Customizing the Chart Before Installing](https://helm.sh/docs/intro/using_helm/#customizing-the-chart-before-installing). To see all configurable options with detailed comments: - -```console -helm show values prometheus-community/kube-state-metrics -``` - -### kube-rbac-proxy - -You can enable `kube-state-metrics` endpoint protection using `kube-rbac-proxy`. By setting `kubeRBACProxy.enabled: true`, this chart will deploy one RBAC proxy container per endpoint (metrics & telemetry). -To authorize access, authenticate your requests (via a `ServiceAccount` for example) with a `ClusterRole` attached such as: - -```yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: kube-state-metrics-read -rules: - - apiGroups: [ "" ] - resources: ["services/kube-state-metrics"] - verbs: - - get -``` - -See [kube-rbac-proxy examples](https://github.com/brancz/kube-rbac-proxy/tree/master/examples/resource-attributes) for more details. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/NOTES.txt b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/NOTES.txt deleted file mode 100644 index 3589c24ec3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/NOTES.txt +++ /dev/null @@ -1,23 +0,0 @@ -kube-state-metrics is a simple service that listens to the Kubernetes API server and generates metrics about the state of the objects. -The exposed metrics can be found here: -https://github.com/kubernetes/kube-state-metrics/blob/master/docs/README.md#exposed-metrics - -The metrics are exported on the HTTP endpoint /metrics on the listening port. -In your case, {{ template "kube-state-metrics.fullname" . }}.{{ template "kube-state-metrics.namespace" . }}.svc.cluster.local:{{ .Values.service.port }}/metrics - -They are served either as plaintext or protobuf depending on the Accept header. -They are designed to be consumed either by Prometheus itself or by a scraper that is compatible with scraping a Prometheus client endpoint. - -{{- if .Values.kubeRBACProxy.enabled}} - -kube-rbac-proxy endpoint protections is enabled: -- Metrics endpoints are now HTTPS -- Ensure that the client authenticates the requests (e.g. via service account) with the following role permissions: -``` -rules: - - apiGroups: [ "" ] - resources: ["services/{{ template "kube-state-metrics.fullname" . }}"] - verbs: - - get -``` -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/_helpers.tpl deleted file mode 100644 index ed277fbb53..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/_helpers.tpl +++ /dev/null @@ -1,196 +0,0 @@ -# Rancher -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -{{- define "monitoring_registry" -}} - {{- $temp_registry := (include "system_default_registry" .) -}} - {{- if $temp_registry -}} - {{- trimSuffix "/" $temp_registry -}} - {{- else -}} - {{- .Values.global.imageRegistry -}} - {{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "kube-state-metrics.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "kube-state-metrics.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the service account to use -*/}} -{{- define "kube-state-metrics.serviceAccountName" -}} -{{- if .Values.serviceAccount.create -}} - {{ default (include "kube-state-metrics.fullname" .) .Values.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* -Allow the release namespace to be overridden for multi-namespace deployments in combined charts -*/}} -{{- define "kube-state-metrics.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "kube-state-metrics.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Generate basic labels -*/}} -{{- define "kube-state-metrics.labels" }} -helm.sh/chart: {{ template "kube-state-metrics.chart" . }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -app.kubernetes.io/component: metrics -app.kubernetes.io/part-of: {{ template "kube-state-metrics.name" . }} -{{- include "kube-state-metrics.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -{{- if .Values.customLabels }} -{{ toYaml .Values.customLabels }} -{{- end }} -{{- if .Values.releaseLabel }} -release: {{ .Release.Name }} -{{- end }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "kube-state-metrics.selectorLabels" }} -{{- if .Values.selectorOverride }} -{{ toYaml .Values.selectorOverride }} -{{- else }} -app.kubernetes.io/name: {{ include "kube-state-metrics.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} -{{- end }} - -{{/* Sets default scrape limits for servicemonitor */}} -{{- define "servicemonitor.scrapeLimits" -}} -{{- with .sampleLimit }} -sampleLimit: {{ . }} -{{- end }} -{{- with .targetLimit }} -targetLimit: {{ . }} -{{- end }} -{{- with .labelLimit }} -labelLimit: {{ . }} -{{- end }} -{{- with .labelNameLengthLimit }} -labelNameLengthLimit: {{ . }} -{{- end }} -{{- with .labelValueLengthLimit }} -labelValueLengthLimit: {{ . }} -{{- end }} -{{- end -}} - -{{/* -Formats imagePullSecrets. Input is (dict "Values" .Values "imagePullSecrets" .{specific imagePullSecrets}) -*/}} -{{- define "kube-state-metrics.imagePullSecrets" -}} -{{- range (concat .Values.global.imagePullSecrets .imagePullSecrets) }} - {{- if eq (typeOf .) "map[string]interface {}" }} -- {{ toYaml . | trim }} - {{- else }} -- name: {{ . }} - {{- end }} -{{- end }} -{{- end -}} - -{{/* -The image to use for kube-state-metrics -*/}} -{{- define "kube-state-metrics.image" -}} -{{- $registry := (include "monitoring_registry" .) }} -{{- if .Values.image.sha }} -{{- if $registry }} -{{- printf "%s/%s:%s@%s" $registry .Values.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.image.tag) .Values.image.sha }} -{{- else }} -{{- printf "%s/%s:%s@%s" .Values.image.registry .Values.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.image.tag) .Values.image.sha }} -{{- end }} -{{- else }} -{{- if $registry }} -{{- printf "%s/%s:%s" $registry .Values.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.image.tag) }} -{{- else }} -{{- printf "%s/%s:%s" .Values.image.registry .Values.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.image.tag) }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -The image to use for kubeRBACProxy -*/}} -{{- define "kubeRBACProxy.image" -}} -{{- $registry := (include "monitoring_registry" .) }} -{{- if .Values.kubeRBACProxy.image.sha }} -{{- if $registry }} -{{- printf "%s/%s:%s@%s" $registry .Values.kubeRBACProxy.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.kubeRBACProxy.image.tag) .Values.kubeRBACProxy.image.sha }} -{{- else }} -{{- printf "%s/%s:%s@%s" .Values.kubeRBACProxy.image.registry .Values.kubeRBACProxy.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.kubeRBACProxy.image.tag) .Values.kubeRBACProxy.image.sha }} -{{- end }} -{{- else }} -{{- if $registry }} -{{- printf "%s/%s:%s" $registry .Values.kubeRBACProxy.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.kubeRBACProxy.image.tag) }} -{{- else }} -{{- printf "%s/%s:%s" .Values.kubeRBACProxy.image.registry .Values.kubeRBACProxy.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.kubeRBACProxy.image.tag) }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/ciliumnetworkpolicy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/ciliumnetworkpolicy.yaml deleted file mode 100644 index 025cd47a88..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/ciliumnetworkpolicy.yaml +++ /dev/null @@ -1,33 +0,0 @@ -{{- if and .Values.networkPolicy.enabled (eq .Values.networkPolicy.flavor "cilium") }} -apiVersion: cilium.io/v2 -kind: CiliumNetworkPolicy -metadata: - {{- if .Values.annotations }} - annotations: - {{ toYaml .Values.annotations | nindent 4 }} - {{- end }} - labels: - {{- include "kube-state-metrics.labels" . | indent 4 }} - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} -spec: - endpointSelector: - matchLabels: - {{- include "kube-state-metrics.selectorLabels" . | indent 6 }} - egress: - {{- if and .Values.networkPolicy.cilium .Values.networkPolicy.cilium.kubeApiServerSelector }} - {{ toYaml .Values.networkPolicy.cilium.kubeApiServerSelector | nindent 6 }} - {{- else }} - - toEntities: - - kube-apiserver - {{- end }} - ingress: - - toPorts: - - ports: - - port: {{ .Values.service.port | quote }} - protocol: TCP - {{- if .Values.selfMonitor.enabled }} - - port: {{ .Values.selfMonitor.telemetryPort | default 8081 | quote }} - protocol: TCP - {{ end }} -{{ end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/clusterrolebinding.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/clusterrolebinding.yaml deleted file mode 100644 index cf9f628d04..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/clusterrolebinding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if and .Values.rbac.create .Values.rbac.useClusterRole -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - {{- include "kube-state-metrics.labels" . | indent 4 }} - name: {{ template "kube-state-metrics.fullname" . }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole -{{- if .Values.rbac.useExistingRole }} - name: {{ .Values.rbac.useExistingRole }} -{{- else }} - name: {{ template "kube-state-metrics.fullname" . }} -{{- end }} -subjects: -- kind: ServiceAccount - name: {{ template "kube-state-metrics.serviceAccountName" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/crs-configmap.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/crs-configmap.yaml deleted file mode 100644 index 72986a6077..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/crs-configmap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -{{- if .Values.customResourceState.enabled}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "kube-state-metrics.fullname" . }}-customresourcestate-config -data: - config.yaml: | - {{- toYaml .Values.customResourceState.config | nindent 4 }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/deployment.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/deployment.yaml deleted file mode 100644 index 175375c45e..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/deployment.yaml +++ /dev/null @@ -1,278 +0,0 @@ -apiVersion: apps/v1 -{{- if .Values.autosharding.enabled }} -kind: StatefulSet -{{- else }} -kind: Deployment -{{- end }} -metadata: - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} - labels: - {{- include "kube-state-metrics.labels" . | indent 4 }} - {{- if .Values.annotations }} - annotations: -{{ toYaml .Values.annotations | indent 4 }} - {{- end }} -spec: - selector: - matchLabels: - {{- include "kube-state-metrics.selectorLabels" . | indent 6 }} - replicas: {{ .Values.replicas }} - {{- if .Values.autosharding.enabled }} - serviceName: {{ template "kube-state-metrics.fullname" . }} - volumeClaimTemplates: [] - {{- end }} - template: - metadata: - labels: - {{- include "kube-state-metrics.labels" . | indent 8 }} - {{- if .Values.podAnnotations }} - annotations: -{{ toYaml .Values.podAnnotations | indent 8 }} - {{- end }} - spec: - hostNetwork: {{ .Values.hostNetwork }} - serviceAccountName: {{ template "kube-state-metrics.serviceAccountName" . }} - {{- if .Values.securityContext.enabled }} - securityContext: {{- omit .Values.securityContext "enabled" | toYaml | nindent 8 }} - {{- end }} - {{- if .Values.priorityClassName }} - priorityClassName: {{ .Values.priorityClassName }} - {{- end }} - containers: - {{- $httpPort := ternary 9090 (.Values.service.port | default 8080) .Values.kubeRBACProxy.enabled}} - {{- $telemetryPort := ternary 9091 (.Values.selfMonitor.telemetryPort | default 8081) .Values.kubeRBACProxy.enabled}} - - name: {{ template "kube-state-metrics.name" . }} - {{- if .Values.autosharding.enabled }} - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - {{- end }} - args: - {{- if .Values.extraArgs }} - {{- .Values.extraArgs | toYaml | nindent 8 }} - {{- end }} - - --port={{ $httpPort }} - {{- if .Values.collectors }} - - --resources={{ .Values.collectors | join "," }} - {{- end }} - {{- if .Values.metricLabelsAllowlist }} - - --metric-labels-allowlist={{ .Values.metricLabelsAllowlist | join "," }} - {{- end }} - {{- if .Values.metricAnnotationsAllowList }} - - --metric-annotations-allowlist={{ .Values.metricAnnotationsAllowList | join "," }} - {{- end }} - {{- if .Values.metricAllowlist }} - - --metric-allowlist={{ .Values.metricAllowlist | join "," }} - {{- end }} - {{- if .Values.metricDenylist }} - - --metric-denylist={{ .Values.metricDenylist | join "," }} - {{- end }} - {{- $namespaces := list }} - {{- if .Values.namespaces }} - {{- range $ns := join "," .Values.namespaces | split "," }} - {{- $namespaces = append $namespaces (tpl $ns $) }} - {{- end }} - {{- end }} - {{- if .Values.releaseNamespace }} - {{- $namespaces = append $namespaces ( include "kube-state-metrics.namespace" . ) }} - {{- end }} - {{- if $namespaces }} - - --namespaces={{ $namespaces | mustUniq | join "," }} - {{- end }} - {{- if .Values.namespacesDenylist }} - - --namespaces-denylist={{ tpl (.Values.namespacesDenylist | join ",") $ }} - {{- end }} - {{- if .Values.autosharding.enabled }} - - --pod=$(POD_NAME) - - --pod-namespace=$(POD_NAMESPACE) - {{- end }} - {{- if .Values.kubeconfig.enabled }} - - --kubeconfig=/opt/k8s/.kube/config - {{- end }} - {{- if .Values.kubeRBACProxy.enabled }} - - --telemetry-host=127.0.0.1 - - --telemetry-port={{ $telemetryPort }} - {{- else }} - {{- if .Values.selfMonitor.telemetryHost }} - - --telemetry-host={{ .Values.selfMonitor.telemetryHost }} - {{- end }} - {{- if .Values.selfMonitor.telemetryPort }} - - --telemetry-port={{ $telemetryPort }} - {{- end }} - {{- if .Values.customResourceState.enabled }} - - --custom-resource-state-config-file=/etc/customresourcestate/config.yaml - {{- end }} - {{- end }} - {{- if or (.Values.kubeconfig.enabled) (.Values.customResourceState.enabled) (.Values.volumeMounts) }} - volumeMounts: - {{- if .Values.kubeconfig.enabled }} - - name: kubeconfig - mountPath: /opt/k8s/.kube/ - readOnly: true - {{- end }} - {{- if .Values.customResourceState.enabled }} - - name: customresourcestate-config - mountPath: /etc/customresourcestate - readOnly: true - {{- end }} - {{- if .Values.volumeMounts }} -{{ toYaml .Values.volumeMounts | indent 8 }} - {{- end }} - {{- end }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - image: {{ include "kube-state-metrics.image" . }} - {{- if eq .Values.kubeRBACProxy.enabled false }} - ports: - - containerPort: {{ .Values.service.port | default 8080}} - name: "http" - {{- if .Values.selfMonitor.enabled }} - - containerPort: {{ $telemetryPort }} - name: "metrics" - {{- end }} - {{- end }} - livenessProbe: - httpGet: - path: /healthz - port: {{ $httpPort }} - initialDelaySeconds: 5 - timeoutSeconds: 5 - readinessProbe: - httpGet: - path: / - port: {{ $httpPort }} - initialDelaySeconds: 5 - timeoutSeconds: 5 - {{- if .Values.resources }} - resources: -{{ toYaml .Values.resources | indent 10 }} -{{- end }} -{{- if .Values.containerSecurityContext }} - securityContext: -{{ toYaml .Values.containerSecurityContext | indent 10 }} -{{- end }} - {{- if .Values.kubeRBACProxy.enabled }} - - name: kube-rbac-proxy-http - args: - {{- if .Values.kubeRBACProxy.extraArgs }} - {{- .Values.kubeRBACProxy.extraArgs | toYaml | nindent 8 }} - {{- end }} - - --secure-listen-address=:{{ .Values.service.port | default 8080}} - - --upstream=http://127.0.0.1:{{ $httpPort }}/ - - --proxy-endpoints-port=8888 - - --config-file=/etc/kube-rbac-proxy-config/config-file.yaml - volumeMounts: - - name: kube-rbac-proxy-config - mountPath: /etc/kube-rbac-proxy-config - {{- with .Values.kubeRBACProxy.volumeMounts }} - {{- toYaml . | nindent 10 }} - {{- end }} - imagePullPolicy: {{ .Values.kubeRBACProxy.image.pullPolicy }} - image: {{ include "kubeRBACProxy.image" . }} - ports: - - containerPort: {{ .Values.service.port | default 8080}} - name: "http" - - containerPort: 8888 - name: "http-healthz" - readinessProbe: - httpGet: - scheme: HTTPS - port: 8888 - path: healthz - initialDelaySeconds: 5 - timeoutSeconds: 5 - {{- if .Values.kubeRBACProxy.resources }} - resources: -{{ toYaml .Values.kubeRBACProxy.resources | indent 10 }} -{{- end }} -{{- if .Values.kubeRBACProxy.containerSecurityContext }} - securityContext: -{{ toYaml .Values.kubeRBACProxy.containerSecurityContext | indent 10 }} -{{- end }} - {{- if .Values.selfMonitor.enabled }} - - name: kube-rbac-proxy-telemetry - args: - {{- if .Values.kubeRBACProxy.extraArgs }} - {{- .Values.kubeRBACProxy.extraArgs | toYaml | nindent 8 }} - {{- end }} - - --secure-listen-address=:{{ .Values.selfMonitor.telemetryPort | default 8081 }} - - --upstream=http://127.0.0.1:{{ $telemetryPort }}/ - - --proxy-endpoints-port=8889 - - --config-file=/etc/kube-rbac-proxy-config/config-file.yaml - volumeMounts: - - name: kube-rbac-proxy-config - mountPath: /etc/kube-rbac-proxy-config - {{- with .Values.kubeRBACProxy.volumeMounts }} - {{- toYaml . | nindent 10 }} - {{- end }} - imagePullPolicy: {{ .Values.kubeRBACProxy.image.pullPolicy }} - image: {{ include "kubeRBACProxy.image" . }} - ports: - - containerPort: {{ .Values.selfMonitor.telemetryPort | default 8081 }} - name: "metrics" - - containerPort: 8889 - name: "metrics-healthz" - readinessProbe: - httpGet: - scheme: HTTPS - port: 8889 - path: healthz - initialDelaySeconds: 5 - timeoutSeconds: 5 - {{- if .Values.kubeRBACProxy.resources }} - resources: -{{ toYaml .Values.kubeRBACProxy.resources | indent 10 }} -{{- end }} -{{- if .Values.kubeRBACProxy.containerSecurityContext }} - securityContext: -{{ toYaml .Values.kubeRBACProxy.containerSecurityContext | indent 10 }} -{{- end }} - {{- end }} - {{- end }} -{{- if or .Values.imagePullSecrets .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- include "kube-state-metrics.imagePullSecrets" (dict "Values" .Values "imagePullSecrets" .Values.imagePullSecrets) | indent 8 }} - {{- end }} - {{- if .Values.affinity }} - affinity: -{{ toYaml .Values.affinity | indent 8 }} - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} - {{- if .Values.nodeSelector }} -{{ toYaml .Values.nodeSelector | indent 8 }} - {{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} - {{- if .Values.tolerations }} -{{ toYaml .Values.tolerations | indent 8 }} - {{- end }} - {{- if .Values.topologySpreadConstraints }} - topologySpreadConstraints: -{{ toYaml .Values.topologySpreadConstraints | indent 8 }} - {{- end }} - {{- if or (.Values.kubeconfig.enabled) (.Values.customResourceState.enabled) (.Values.volumes) (.Values.kubeRBACProxy.enabled) }} - volumes: - {{- if .Values.kubeconfig.enabled}} - - name: kubeconfig - secret: - secretName: {{ template "kube-state-metrics.fullname" . }}-kubeconfig - {{- end }} - {{- if .Values.kubeRBACProxy.enabled}} - - name: kube-rbac-proxy-config - configMap: - name: {{ template "kube-state-metrics.fullname" . }}-rbac-config - {{- end }} - {{- if .Values.customResourceState.enabled}} - - name: customresourcestate-config - configMap: - name: {{ template "kube-state-metrics.fullname" . }}-customresourcestate-config - {{- end }} - {{- if .Values.volumes }} -{{ toYaml .Values.volumes | indent 8 }} - {{- end }} - {{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/kubeconfig-secret.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/kubeconfig-secret.yaml deleted file mode 100644 index 6af0084502..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/kubeconfig-secret.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if .Values.kubeconfig.enabled -}} -apiVersion: v1 -kind: Secret -metadata: - name: {{ template "kube-state-metrics.fullname" . }}-kubeconfig - namespace: {{ template "kube-state-metrics.namespace" . }} - labels: - {{- include "kube-state-metrics.labels" . | indent 4 }} -type: Opaque -data: - config: '{{ .Values.kubeconfig.secret }}' -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/networkpolicy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/networkpolicy.yaml deleted file mode 100644 index 309b38ec54..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/networkpolicy.yaml +++ /dev/null @@ -1,43 +0,0 @@ -{{- if and .Values.networkPolicy.enabled (eq .Values.networkPolicy.flavor "kubernetes") }} -kind: NetworkPolicy -apiVersion: networking.k8s.io/v1 -metadata: - {{- if .Values.annotations }} - annotations: - {{ toYaml .Values.annotations | nindent 4 }} - {{- end }} - labels: - {{- include "kube-state-metrics.labels" . | indent 4 }} - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} -spec: - {{- if .Values.networkPolicy.egress }} - ## Deny all egress by default - egress: - {{- toYaml .Values.networkPolicy.egress | nindent 4 }} - {{- end }} - ingress: - {{- if .Values.networkPolicy.ingress }} - {{- toYaml .Values.networkPolicy.ingress | nindent 4 }} - {{- else }} - ## Allow ingress on default ports by default - - ports: - - port: {{ .Values.service.port | default 8080 }} - protocol: TCP - {{- if .Values.selfMonitor.enabled }} - {{- $telemetryPort := ternary 9091 (.Values.selfMonitor.telemetryPort | default 8081) .Values.kubeRBACProxy.enabled}} - - port: {{ $telemetryPort }} - protocol: TCP - {{- end }} - {{- end }} - podSelector: - {{- if .Values.networkPolicy.podSelector }} - {{- toYaml .Values.networkPolicy.podSelector | nindent 4 }} - {{- else }} - matchLabels: - {{- include "kube-state-metrics.selectorLabels" . | indent 6 }} - {{- end }} - policyTypes: - - Ingress - - Egress -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/pdb.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/pdb.yaml deleted file mode 100644 index 3771b511de..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/pdb.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- if .Values.podDisruptionBudget -}} -{{ if $.Capabilities.APIVersions.Has "policy/v1/PodDisruptionBudget" -}} -apiVersion: policy/v1 -{{- else -}} -apiVersion: policy/v1beta1 -{{- end }} -kind: PodDisruptionBudget -metadata: - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} - labels: - {{- include "kube-state-metrics.labels" . | indent 4 }} -spec: - selector: - matchLabels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} -{{ toYaml .Values.podDisruptionBudget | indent 2 }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/podsecuritypolicy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/podsecuritypolicy.yaml deleted file mode 100644 index d9d944d740..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/podsecuritypolicy.yaml +++ /dev/null @@ -1,39 +0,0 @@ -{{- if and .Values.rbac.create (and (or .Values.global.cattle.psp.enabled .Values.podSecurityPolicy.enabled) (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy")) }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "kube-state-metrics.fullname" . }} - labels: - {{- include "kube-state-metrics.labels" . | indent 4 }} -{{- if .Values.podSecurityPolicy.annotations }} - annotations: -{{ toYaml .Values.podSecurityPolicy.annotations | indent 4 }} -{{- end }} -spec: - privileged: false - volumes: - - 'secret' -{{- if .Values.podSecurityPolicy.additionalVolumes }} -{{ toYaml .Values.podSecurityPolicy.additionalVolumes | indent 4 }} -{{- end }} - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - readOnlyRootFilesystem: false -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/psp-clusterrole.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/psp-clusterrole.yaml deleted file mode 100644 index c69e01a716..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/psp-clusterrole.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if and .Values.rbac.create (and (or .Values.global.cattle.psp.enabled .Values.podSecurityPolicy.enabled) (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy")) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - {{- include "kube-state-metrics.labels" . | indent 4 }} - name: psp-{{ template "kube-state-metrics.fullname" . }} -rules: -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if semverCompare "> 1.15.0-0" $kubeTargetVersion }} -- apiGroups: ['policy'] -{{- else }} -- apiGroups: ['extensions'] -{{- end }} - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "kube-state-metrics.fullname" . }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/psp-clusterrolebinding.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/psp-clusterrolebinding.yaml deleted file mode 100644 index df81c49028..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/psp-clusterrolebinding.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if and .Values.rbac.create (and (or .Values.global.cattle.psp.enabled .Values.podSecurityPolicy.enabled) (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy")) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - {{- include "kube-state-metrics.labels" . | indent 4 }} - name: psp-{{ template "kube-state-metrics.fullname" . }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: psp-{{ template "kube-state-metrics.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ template "kube-state-metrics.serviceAccountName" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/rbac-configmap.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/rbac-configmap.yaml deleted file mode 100644 index 812c13b875..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/rbac-configmap.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{- if .Values.kubeRBACProxy.enabled}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "kube-state-metrics.fullname" . }}-rbac-config -data: - config-file.yaml: |+ - authorization: - resourceAttributes: - namespace: {{ template "kube-state-metrics.namespace" . }} - apiVersion: v1 - resource: services - subresource: {{ template "kube-state-metrics.fullname" . }} - name: {{ template "kube-state-metrics.fullname" . }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/role.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/role.yaml deleted file mode 100644 index 0170878376..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/role.yaml +++ /dev/null @@ -1,215 +0,0 @@ -{{- if not (kindIs "slice" .Values.collectors) }} -{{- fail "Collectors need to be a List since kube-state-metrics chart 3.2.2. Please check README for more information."}} -{{- end }} -{{- if and (eq .Values.rbac.create true) (not .Values.rbac.useExistingRole) -}} -{{- range (ternary (join "," .Values.namespaces | split "," ) (list "") (eq $.Values.rbac.useClusterRole false)) }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -{{- if eq $.Values.rbac.useClusterRole false }} -kind: Role -{{- else }} -kind: ClusterRole -{{- end }} -metadata: - labels: - {{- include "kube-state-metrics.labels" $ | indent 4 }} - name: {{ template "kube-state-metrics.fullname" $ }} -{{- if eq $.Values.rbac.useClusterRole false }} - namespace: {{ . }} -{{- end }} -rules: -{{ if has "certificatesigningrequests" $.Values.collectors }} -- apiGroups: ["certificates.k8s.io"] - resources: - - certificatesigningrequests - verbs: ["list", "watch"] -{{ end -}} -{{ if has "configmaps" $.Values.collectors }} -- apiGroups: [""] - resources: - - configmaps - verbs: ["list", "watch"] -{{ end -}} -{{ if has "cronjobs" $.Values.collectors }} -- apiGroups: ["batch"] - resources: - - cronjobs - verbs: ["list", "watch"] -{{ end -}} -{{ if has "daemonsets" $.Values.collectors }} -- apiGroups: ["extensions", "apps"] - resources: - - daemonsets - verbs: ["list", "watch"] -{{ end -}} -{{ if has "deployments" $.Values.collectors }} -- apiGroups: ["extensions", "apps"] - resources: - - deployments - verbs: ["list", "watch"] -{{ end -}} -{{ if has "endpoints" $.Values.collectors }} -- apiGroups: [""] - resources: - - endpoints - verbs: ["list", "watch"] -{{ end -}} -{{ if has "endpointslices" $.Values.collectors }} -- apiGroups: ["discovery.k8s.io"] - resources: - - endpointslices - verbs: ["list", "watch"] -{{ end -}} -{{ if has "horizontalpodautoscalers" $.Values.collectors }} -- apiGroups: ["autoscaling"] - resources: - - horizontalpodautoscalers - verbs: ["list", "watch"] -{{ end -}} -{{ if has "ingresses" $.Values.collectors }} -- apiGroups: ["extensions", "networking.k8s.io"] - resources: - - ingresses - verbs: ["list", "watch"] -{{ end -}} -{{ if has "jobs" $.Values.collectors }} -- apiGroups: ["batch"] - resources: - - jobs - verbs: ["list", "watch"] -{{ end -}} -{{ if has "leases" $.Values.collectors }} -- apiGroups: ["coordination.k8s.io"] - resources: - - leases - verbs: ["list", "watch"] -{{ end -}} -{{ if has "limitranges" $.Values.collectors }} -- apiGroups: [""] - resources: - - limitranges - verbs: ["list", "watch"] -{{ end -}} -{{ if has "mutatingwebhookconfigurations" $.Values.collectors }} -- apiGroups: ["admissionregistration.k8s.io"] - resources: - - mutatingwebhookconfigurations - verbs: ["list", "watch"] -{{ end -}} -{{ if has "namespaces" $.Values.collectors }} -- apiGroups: [""] - resources: - - namespaces - verbs: ["list", "watch"] -{{ end -}} -{{ if has "networkpolicies" $.Values.collectors }} -- apiGroups: ["networking.k8s.io"] - resources: - - networkpolicies - verbs: ["list", "watch"] -{{ end -}} -{{ if has "nodes" $.Values.collectors }} -- apiGroups: [""] - resources: - - nodes - verbs: ["list", "watch"] -{{ end -}} -{{ if has "persistentvolumeclaims" $.Values.collectors }} -- apiGroups: [""] - resources: - - persistentvolumeclaims - verbs: ["list", "watch"] -{{ end -}} -{{ if has "persistentvolumes" $.Values.collectors }} -- apiGroups: [""] - resources: - - persistentvolumes - verbs: ["list", "watch"] -{{ end -}} -{{ if has "poddisruptionbudgets" $.Values.collectors }} -- apiGroups: ["policy"] - resources: - - poddisruptionbudgets - verbs: ["list", "watch"] -{{ end -}} -{{ if has "pods" $.Values.collectors }} -- apiGroups: [""] - resources: - - pods - verbs: ["list", "watch"] -{{ end -}} -{{ if has "replicasets" $.Values.collectors }} -- apiGroups: ["extensions", "apps"] - resources: - - replicasets - verbs: ["list", "watch"] -{{ end -}} -{{ if has "replicationcontrollers" $.Values.collectors }} -- apiGroups: [""] - resources: - - replicationcontrollers - verbs: ["list", "watch"] -{{ end -}} -{{ if has "resourcequotas" $.Values.collectors }} -- apiGroups: [""] - resources: - - resourcequotas - verbs: ["list", "watch"] -{{ end -}} -{{ if has "secrets" $.Values.collectors }} -- apiGroups: [""] - resources: - - secrets - verbs: ["list", "watch"] -{{ end -}} -{{ if has "services" $.Values.collectors }} -- apiGroups: [""] - resources: - - services - verbs: ["list", "watch"] -{{ end -}} -{{ if has "statefulsets" $.Values.collectors }} -- apiGroups: ["apps"] - resources: - - statefulsets - verbs: ["list", "watch"] -{{ end -}} -{{ if has "storageclasses" $.Values.collectors }} -- apiGroups: ["storage.k8s.io"] - resources: - - storageclasses - verbs: ["list", "watch"] -{{ end -}} -{{ if has "validatingwebhookconfigurations" $.Values.collectors }} -- apiGroups: ["admissionregistration.k8s.io"] - resources: - - validatingwebhookconfigurations - verbs: ["list", "watch"] -{{ end -}} -{{ if has "volumeattachments" $.Values.collectors }} -- apiGroups: ["storage.k8s.io"] - resources: - - volumeattachments - verbs: ["list", "watch"] -{{ end -}} -{{- if $.Values.kubeRBACProxy.enabled }} -- apiGroups: ["authentication.k8s.io"] - resources: - - tokenreviews - verbs: ["create"] -- apiGroups: ["authorization.k8s.io"] - resources: - - subjectaccessreviews - verbs: ["create"] -{{- end }} -{{- if $.Values.customResourceState.enabled }} -- apiGroups: ["apiextensions.k8s.io"] - resources: - - customresourcedefinitions - verbs: ["list", "watch"] -{{- end }} -{{ if $.Values.rbac.extraRules }} -{{ toYaml $.Values.rbac.extraRules }} -{{ end }} -{{- end -}} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/rolebinding.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/rolebinding.yaml deleted file mode 100644 index 330651b73f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/rolebinding.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- if and (eq .Values.rbac.create true) (eq .Values.rbac.useClusterRole false) -}} -{{- range (join "," $.Values.namespaces) | split "," }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - {{- include "kube-state-metrics.labels" $ | indent 4 }} - name: {{ template "kube-state-metrics.fullname" $ }} - namespace: {{ . }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role -{{- if (not $.Values.rbac.useExistingRole) }} - name: {{ template "kube-state-metrics.fullname" $ }} -{{- else }} - name: {{ $.Values.rbac.useExistingRole }} -{{- end }} -subjects: -- kind: ServiceAccount - name: {{ template "kube-state-metrics.serviceAccountName" $ }} - namespace: {{ template "kube-state-metrics.namespace" $ }} -{{- end -}} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/service.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/service.yaml deleted file mode 100644 index 6c486a662a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/service.yaml +++ /dev/null @@ -1,49 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} - labels: - {{- include "kube-state-metrics.labels" . | indent 4 }} - annotations: - {{- if .Values.prometheusScrape }} - prometheus.io/scrape: '{{ .Values.prometheusScrape }}' - {{- end }} - {{- if .Values.service.annotations }} - {{- toYaml .Values.service.annotations | nindent 4 }} - {{- end }} -spec: - type: "{{ .Values.service.type }}" - ports: - - name: "http" - protocol: TCP - port: {{ .Values.service.port | default 8080}} - {{- if .Values.service.nodePort }} - nodePort: {{ .Values.service.nodePort }} - {{- end }} - targetPort: {{ .Values.service.port | default 8080}} - {{ if .Values.selfMonitor.enabled }} - - name: "metrics" - protocol: TCP - port: {{ .Values.selfMonitor.telemetryPort | default 8081 }} - targetPort: {{ .Values.selfMonitor.telemetryPort | default 8081 }} - {{- if .Values.selfMonitor.telemetryNodePort }} - nodePort: {{ .Values.selfMonitor.telemetryNodePort }} - {{- end }} - {{ end }} -{{- if .Values.service.loadBalancerIP }} - loadBalancerIP: "{{ .Values.service.loadBalancerIP }}" -{{- end }} -{{- if .Values.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- range $cidr := .Values.service.loadBalancerSourceRanges }} - - {{ $cidr }} - {{- end }} -{{- end }} -{{- if .Values.autosharding.enabled }} - clusterIP: None -{{- else if .Values.service.clusterIP }} - clusterIP: "{{ .Values.service.clusterIP }}" -{{- end }} - selector: - {{- include "kube-state-metrics.selectorLabels" . | indent 4 }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/serviceaccount.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/serviceaccount.yaml deleted file mode 100644 index a7ff4dd3d7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/serviceaccount.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{- if .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - {{- include "kube-state-metrics.labels" . | indent 4 }} - name: {{ template "kube-state-metrics.serviceAccountName" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} -{{- if .Values.serviceAccount.annotations }} - annotations: -{{ toYaml .Values.serviceAccount.annotations | indent 4 }} -{{- end }} -imagePullSecrets: - {{- include "kube-state-metrics.imagePullSecrets" (dict "Values" .Values "imagePullSecrets" .Values.serviceAccount.imagePullSecrets) | indent 2 }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/servicemonitor.yaml deleted file mode 100644 index 79fd00481c..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/servicemonitor.yaml +++ /dev/null @@ -1,113 +0,0 @@ -{{- if .Values.prometheus.monitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} - labels: - {{- include "kube-state-metrics.labels" . | indent 4 }} - {{- with .Values.prometheus.monitor.additionalLabels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.prometheus.monitor.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - jobLabel: {{ default "app.kubernetes.io/name" .Values.prometheus.monitor.jobLabel }} - {{- with .Values.prometheus.monitor.targetLabels }} - targetLabels: - {{- toYaml . | trim | nindent 4 }} - {{- end }} - {{- with .Values.prometheus.monitor.podTargetLabels }} - podTargetLabels: - {{- toYaml . | trim | nindent 4 }} - {{- end }} - {{- include "servicemonitor.scrapeLimits" .Values.prometheus.monitor | indent 2 }} - selector: - matchLabels: - {{- with .Values.prometheus.monitor.selectorOverride }} - {{- toYaml . | nindent 6 }} - {{- else }} - {{- include "kube-state-metrics.selectorLabels" . | indent 6 }} - {{- end }} - endpoints: - - port: http - {{- if .Values.prometheus.monitor.interval }} - interval: {{ .Values.prometheus.monitor.interval }} - {{- end }} - {{- if .Values.prometheus.monitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.prometheus.monitor.scrapeTimeout }} - {{- end }} - {{- if .Values.prometheus.monitor.proxyUrl }} - proxyUrl: {{ .Values.prometheus.monitor.proxyUrl}} - {{- end }} - {{- if .Values.prometheus.monitor.honorLabels }} - honorLabels: true - {{- end }} - metricRelabelings: - {{- if .Values.prometheus.monitor.metricRelabelings }} - {{- toYaml .Values.prometheus.monitor.metricRelabelings | nindent 8 }} - {{- end }} - {{ if .Values.global.cattle.clusterId }} - - sourceLabels: [__address__] - targetLabel: cluster_id - replacement: {{ .Values.global.cattle.clusterId }} - {{- end }} - {{ if .Values.global.cattle.clusterName }} - - sourceLabels: [__address__] - targetLabel: cluster_name - replacement: {{ .Values.global.cattle.clusterName }} - {{- end }} - {{- if .Values.prometheus.monitor.relabelings }} - relabelings: - {{- toYaml .Values.prometheus.monitor.relabelings | nindent 8 }} - {{- end }} - {{- if .Values.prometheus.monitor.scheme }} - scheme: {{ .Values.prometheus.monitor.scheme }} - {{- end }} - {{- if .Values.prometheus.monitor.tlsConfig }} - tlsConfig: - {{- toYaml .Values.prometheus.monitor.tlsConfig | nindent 8 }} - {{- end }} - {{- if .Values.prometheus.monitor.bearerTokenFile }} - bearerTokenFile: {{ .Values.prometheus.monitor.bearerTokenFile }} - {{- end }} - {{- with .Values.prometheus.monitor.bearerTokenSecret }} - bearerTokenSecret: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- if .Values.selfMonitor.enabled }} - - port: metrics - {{- if .Values.prometheus.monitor.interval }} - interval: {{ .Values.prometheus.monitor.interval }} - {{- end }} - {{- if .Values.prometheus.monitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.prometheus.monitor.scrapeTimeout }} - {{- end }} - {{- if .Values.prometheus.monitor.proxyUrl }} - proxyUrl: {{ .Values.prometheus.monitor.proxyUrl}} - {{- end }} - {{- if .Values.prometheus.monitor.honorLabels }} - honorLabels: true - {{- end }} - {{- if .Values.prometheus.monitor.relabelings }} - relabelings: - {{- toYaml .Values.prometheus.monitor.relabelings | nindent 8 }} - {{- end }} - {{- if .Values.prometheus.monitor.scheme }} - scheme: {{ .Values.prometheus.monitor.scheme }} - {{- end }} - {{- if .Values.prometheus.monitor.tlsConfig }} - tlsConfig: - {{- toYaml .Values.prometheus.monitor.tlsConfig | nindent 8 }} - {{- end }} - {{- if .Values.prometheus.monitor.bearerTokenFile }} - bearerTokenFile: {{ .Values.prometheus.monitor.bearerTokenFile }} - {{- end }} - {{- with .Values.prometheus.monitor.bearerTokenSecret }} - bearerTokenSecret: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/stsdiscovery-role.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/stsdiscovery-role.yaml deleted file mode 100644 index 489de147c1..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/stsdiscovery-role.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{- if and .Values.autosharding.enabled .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: stsdiscovery-{{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} - labels: - {{- include "kube-state-metrics.labels" . | indent 4 }} -rules: -- apiGroups: - - "" - resources: - - pods - verbs: - - get -- apiGroups: - - apps - resourceNames: - - {{ template "kube-state-metrics.fullname" . }} - resources: - - statefulsets - verbs: - - get - - list - - watch -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/stsdiscovery-rolebinding.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/stsdiscovery-rolebinding.yaml deleted file mode 100644 index 73b37a4f64..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/stsdiscovery-rolebinding.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if and .Values.autosharding.enabled .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: stsdiscovery-{{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} - labels: - {{- include "kube-state-metrics.labels" . | indent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: stsdiscovery-{{ template "kube-state-metrics.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ template "kube-state-metrics.serviceAccountName" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/verticalpodautoscaler.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/verticalpodautoscaler.yaml deleted file mode 100644 index 5facc37b4d..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/templates/verticalpodautoscaler.yaml +++ /dev/null @@ -1,38 +0,0 @@ -{{- if and (.Capabilities.APIVersions.Has "autoscaling.k8s.io/v1") (.Values.verticalPodAutoscaler.enabled) }} -apiVersion: autoscaling.k8s.io/v1 -kind: VerticalPodAutoscaler -metadata: - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} - labels: - {{- include "kube-state-metrics.labels" . | indent 4 }} -spec: - resourcePolicy: - containerPolicies: - - containerName: {{ template "kube-state-metrics.name" . }} - {{- if .Values.verticalPodAutoscaler.controlledResources }} - controlledResources: {{ .Values.verticalPodAutoscaler.controlledResources }} - {{- end }} - {{- if .Values.verticalPodAutoscaler.maxAllowed }} - maxAllowed: - {{ toYaml .Values.verticalPodAutoscaler.maxAllowed | nindent 8 }} - {{- end }} - {{- if .Values.verticalPodAutoscaler.minAllowed }} - minAllowed: - {{ toYaml .Values.verticalPodAutoscaler.minAllowed | nindent 8 }} - {{- end }} - targetRef: - apiVersion: apps/v1 - {{- if .Values.autosharding.enabled }} - kind: StatefulSet - {{- else }} - kind: Deployment - {{- end }} - name: {{ template "kube-state-metrics.fullname" . }} - {{- if .Values.verticalPodAutoscaler.updatePolicy }} - updatePolicy: - {{- if .Values.verticalPodAutoscaler.updatePolicy.updateMode }} - updateMode: {{ .Values.verticalPodAutoscaler.updatePolicy.updateMode }} - {{- end }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/values.yaml deleted file mode 100644 index 55d7ad2790..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kube-state-metrics/values.yaml +++ /dev/null @@ -1,417 +0,0 @@ -# Default values for kube-state-metrics. -prometheusScrape: true -image: - registry: docker.io - repository: rancher/mirrored-kube-state-metrics-kube-state-metrics - tag: v2.10.1 - sha: "" - pullPolicy: IfNotPresent - -imagePullSecrets: [] -# - name: "image-pull-secret" - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - - # To help compatibility with other charts which use global.imagePullSecrets. - # Allow either an array of {name: pullSecret} maps (k8s-style), or an array of strings (more common helm-style). - # global: - # imagePullSecrets: - # - name: pullSecret1 - # - name: pullSecret2 - # or - # global: - # imagePullSecrets: - # - pullSecret1 - # - pullSecret2 - imagePullSecrets: [] - # - # Allow parent charts to override registry hostname - imageRegistry: "" - -# If set to true, this will deploy kube-state-metrics as a StatefulSet and the data -# will be automatically sharded across <.Values.replicas> pods using the built-in -# autodiscovery feature: https://github.com/kubernetes/kube-state-metrics#automated-sharding -# This is an experimental feature and there are no stability guarantees. -autosharding: - enabled: false - -replicas: 1 - -# List of additional cli arguments to configure kube-state-metrics -# for example: --enable-gzip-encoding, --log-file, etc. -# all the possible args can be found here: https://github.com/kubernetes/kube-state-metrics/blob/master/docs/cli-arguments.md -extraArgs: [] - -service: - port: 8080 - # Default to clusterIP for backward compatibility - type: ClusterIP - nodePort: 0 - loadBalancerIP: "" - # Only allow access to the loadBalancerIP from these IPs - loadBalancerSourceRanges: [] - clusterIP: "" - annotations: {} - -## Additional labels to add to all resources -customLabels: {} - # app: kube-state-metrics - -## Override selector labels -selectorOverride: {} - -## set to true to add the release label so scraping of the servicemonitor with kube-prometheus-stack works out of the box -releaseLabel: false - -hostNetwork: false - -rbac: - # If true, create & use RBAC resources - create: true - - # Set to a rolename to use existing role - skipping role creating - but still doing serviceaccount and rolebinding to it, rolename set here. - # useExistingRole: your-existing-role - - # If set to false - Run without Cluteradmin privs needed - ONLY works if namespace is also set (if useExistingRole is set this name is used as ClusterRole or Role to bind to) - useClusterRole: true - - # Add permissions for CustomResources' apiGroups in Role/ClusterRole. Should be used in conjunction with Custom Resource State Metrics configuration - # Example: - # - apiGroups: ["monitoring.coreos.com"] - # resources: ["prometheuses"] - # verbs: ["list", "watch"] - extraRules: [] - -# Configure kube-rbac-proxy. When enabled, creates one kube-rbac-proxy container per exposed HTTP endpoint (metrics and telemetry if enabled). -# The requests are served through the same service but requests are then HTTPS. -kubeRBACProxy: - enabled: false - image: - repository: rancher/mirrored-kube-rbac-proxy - tag: v0.14.0 - sha: "" - pullPolicy: IfNotPresent - - # List of additional cli arguments to configure kube-rbac-prxy - # for example: --tls-cipher-suites, --log-file, etc. - # all the possible args can be found here: https://github.com/brancz/kube-rbac-proxy#usage - extraArgs: [] - - ## Specify security settings for a Container - ## Allows overrides and additional options compared to (Pod) securityContext - ## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container - containerSecurityContext: {} - - 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:'. - # limits: - # cpu: 100m - # memory: 64Mi - # requests: - # cpu: 10m - # memory: 32Mi - - ## volumeMounts enables mounting custom volumes in rbac-proxy containers - ## Useful for TLS certificates and keys - volumeMounts: [] - # - mountPath: /etc/tls - # name: kube-rbac-proxy-tls - # readOnly: true - -serviceAccount: - # Specifies whether a ServiceAccount should be created, require rbac true - create: true - # The name of the ServiceAccount to use. - # If not set and create is true, a name is generated using the fullname template - name: - # Reference to one or more secrets to be used when pulling images - # ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - imagePullSecrets: [] - # ServiceAccount annotations. - # Use case: AWS EKS IAM roles for service accounts - # ref: https://docs.aws.amazon.com/eks/latest/userguide/specify-service-account-role.html - annotations: {} - -prometheus: - monitor: - enabled: false - annotations: {} - additionalLabels: {} - namespace: "" - jobLabel: "" - targetLabels: [] - podTargetLabels: [] - interval: "" - ## SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. - ## - sampleLimit: 0 - - ## TargetLimit defines a limit on the number of scraped targets that will be accepted. - ## - targetLimit: 0 - - ## Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelLimit: 0 - - ## Per-scrape limit on length of labels name that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelNameLengthLimit: 0 - - ## Per-scrape limit on length of labels value that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelValueLengthLimit: 0 - scrapeTimeout: "" - proxyUrl: "" - selectorOverride: {} - honorLabels: false - metricRelabelings: [] - relabelings: [] - scheme: "" - ## File to read bearer token for scraping targets - bearerTokenFile: "" - ## Secret to mount to read bearer token for scraping targets. The secret needs - ## to be in the same namespace as the service monitor and accessible by the - ## Prometheus Operator - bearerTokenSecret: {} - # name: secret-name - # key: key-name - tlsConfig: {} - -## Specify if a Pod Security Policy for kube-state-metrics must be created -## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/ -## -podSecurityPolicy: - annotations: {} - ## Specify pod annotations - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#apparmor - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#sysctl - ## - # seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*' - # seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' - # apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' - - additionalVolumes: [] - -## Configure network policy for kube-state-metrics -networkPolicy: - enabled: false - # networkPolicy.flavor -- Flavor of the network policy to use. - # Can be: - # * kubernetes for networking.k8s.io/v1/NetworkPolicy - # * cilium for cilium.io/v2/CiliumNetworkPolicy - flavor: kubernetes - - ## Configure the cilium network policy kube-apiserver selector - # cilium: - # kubeApiServerSelector: - # - toEntities: - # - kube-apiserver - - # egress: - # - {} - # ingress: - # - {} - # podSelector: - # matchLabels: - # app.kubernetes.io/name: kube-state-metrics - -securityContext: - enabled: true - runAsGroup: 65534 - runAsUser: 65534 - fsGroup: 65534 - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - -## Specify security settings for a Container -## Allows overrides and additional options compared to (Pod) securityContext -## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container -containerSecurityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - -## Node labels for pod assignment -## Ref: https://kubernetes.io/docs/user-guide/node-selection/ -nodeSelector: {} - -## Affinity settings for pod assignment -## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ -affinity: {} - -## Tolerations for pod assignment -## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -tolerations: [] - -## Topology spread constraints for pod assignment -## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ -topologySpreadConstraints: [] - -# Annotations to be added to the deployment/statefulset -annotations: {} - -# Annotations to be added to the pod -podAnnotations: {} - -## Assign a PriorityClassName to pods if set -# priorityClassName: "" - -# Ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/ -podDisruptionBudget: {} - -# Comma-separated list of metrics to be exposed. -# This list comprises of exact metric names and/or regex patterns. -# The allowlist and denylist are mutually exclusive. -metricAllowlist: [] - -# Comma-separated list of metrics not to be enabled. -# This list comprises of exact metric names and/or regex patterns. -# The allowlist and denylist are mutually exclusive. -metricDenylist: [] - -# Comma-separated list of additional Kubernetes label keys that will be used in the resource's -# labels metric. By default the metric contains only name and namespace labels. -# To include additional labels, provide a list of resource names in their plural form and Kubernetes -# label keys you would like to allow for them (Example: '=namespaces=[k8s-label-1,k8s-label-n,...],pods=[app],...)'. -# A single '*' can be provided per resource instead to allow any labels, but that has -# severe performance implications (Example: '=pods=[*]'). -metricLabelsAllowlist: [] - # - namespaces=[k8s-label-1,k8s-label-n] - -# Comma-separated list of Kubernetes annotations keys that will be used in the resource' -# labels metric. By default the metric contains only name and namespace labels. -# To include additional annotations provide a list of resource names in their plural form and Kubernetes -# annotation keys you would like to allow for them (Example: '=namespaces=[kubernetes.io/team,...],pods=[kubernetes.io/team],...)'. -# A single '*' can be provided per resource instead to allow any annotations, but that has -# severe performance implications (Example: '=pods=[*]'). -metricAnnotationsAllowList: [] - # - pods=[k8s-annotation-1,k8s-annotation-n] - -# Available collectors for kube-state-metrics. -# By default, all available resources are enabled, comment out to disable. -collectors: - - certificatesigningrequests - - configmaps - - cronjobs - - daemonsets - - deployments - - endpoints - - horizontalpodautoscalers - - ingresses - - jobs - - leases - - limitranges - - mutatingwebhookconfigurations - - namespaces - - networkpolicies - - nodes - - persistentvolumeclaims - - persistentvolumes - - poddisruptionbudgets - - pods - - replicasets - - replicationcontrollers - - resourcequotas - - secrets - - services - - statefulsets - - storageclasses - - validatingwebhookconfigurations - - volumeattachments - -# Enabling kubeconfig will pass the --kubeconfig argument to the container -kubeconfig: - enabled: false - # base64 encoded kube-config file - secret: - -# Enabling support for customResourceState, will create a configMap including your config that will be read from kube-state-metrics -customResourceState: - enabled: false - # Add (Cluster)Role permissions to list/watch the customResources defined in the config to rbac.extraRules - config: {} - -# Enable only the release namespace for collecting resources. By default all namespaces are collected. -# If releaseNamespace and namespaces are both set a merged list will be collected. -releaseNamespace: false - -# Comma-separated list(string) or yaml list of namespaces to be enabled for collecting resources. By default all namespaces are collected. -namespaces: "" - -# Comma-separated list of namespaces not to be enabled. If namespaces and namespaces-denylist are both set, -# only namespaces that are excluded in namespaces-denylist will be used. -namespacesDenylist: "" - -## Override the deployment namespace -## -namespaceOverride: "" - -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:'. - # limits: - # cpu: 100m - # memory: 64Mi - # requests: - # cpu: 10m - # memory: 32Mi - -## Provide a k8s version to define apiGroups for podSecurityPolicy Cluster Role. -## For example: kubeTargetVersionOverride: 1.14.9 -## -kubeTargetVersionOverride: "" - -# Enable self metrics configuration for service and Service Monitor -# Default values for telemetry configuration can be overridden -# If you set telemetryNodePort, you must also set service.type to NodePort -selfMonitor: - enabled: false - # telemetryHost: 0.0.0.0 - # telemetryPort: 8081 - # telemetryNodePort: 0 - -# Enable vertical pod autoscaler support for kube-state-metrics -verticalPodAutoscaler: - enabled: false - # List of resources that the vertical pod autoscaler can control. Defaults to cpu and memory - controlledResources: [] - - # Define the max allowed resources for the pod - maxAllowed: {} - # cpu: 200m - # memory: 100Mi - # Define the min allowed resources for the pod - minAllowed: {} - # cpu: 200m - # memory: 100Mi - - # updatePolicy: - # Specifies whether recommended updates are applied when a Pod is started and whether recommended updates - # are applied during the life of a Pod. Possible values are "Off", "Initial", "Recreate", and "Auto". - # updateMode: Auto - -# volumeMounts are used to add custom volume mounts to deployment. -# See example below -volumeMounts: [] -# - mountPath: /etc/config -# name: config-volume - -# volumes are used to add custom volumes to deployment -# See example below -volumes: [] -# - configMap: -# name: cm-for-volume -# name: config-volume diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/Chart.yaml deleted file mode 100644 index c221428dc0..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/Chart.yaml +++ /dev/null @@ -1,14 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.29.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-pushprox -apiVersion: v1 -appVersion: 0.1.0 -description: Sets up a deployment of the PushProx proxy and a DaemonSet of PushProx - clients. -name: kubeAdmControllerManager -type: application -version: 0.2.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/README.md deleted file mode 100644 index 345002f48a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# rancher-pushprox - -A Rancher chart based on Rancher [PushProx](https://github.com/rancher/PushProx) that sets up a Deployment of a PushProx proxy and a DaemonSet of PushProx clients on a Kubernetes cluster. - -Installs [rancher-pushprox](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-pushprox) to create PushProx clients that can access their host's network and register with a PushProx proxy. A [Prometheus Operator](https://github.com/coreos/prometheus-operator) ServiceMonitor CR is also included that is configured to scrape the metrics from each of the clients through the proxy. - -Using an instance of this chart is suitable for the following scenarios: -- You need to scrape metrics from a port that should not be accessible outside of the host (e.g. scraping `etcd` metrics in a hardened cluster) -- You need to scrape metrics on a host that are not exposed outside of 127.0.0.1 (e.g. scraping `kube-proxy` metrics) -- You need to scrape metrics through HTTPS using certs hosted directly on `hostPath` -- You need to scrape metrics from Kubernetes components that require authorization via a service account (e.g. permissions to make request to `/metrics`) -- You need to scrape metrics without access to cacerts (i.e. enable `insecureSkipVerify`) - -The clients and proxy are created based on a Rancher fork of the [prometheus-community/PushProx](https://github.com/prometheus-community/PushProx) project. - -## Upgrading to Kubernetes v1.25+ - -Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. - -As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `global.cattle.psp.enabled` set to `false` if it has been previously set to `true`. -​ -> **Note:** -> In this chart release, any previous field that was associated with any PSP resources have been removed in favor of a single global field: `global.cattle.psp.enabled`. - -> **Note:** -> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** -> -> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. - -Upon setting `global.cattle.psp.enabled` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. - -As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. - -## Configuration - -The following tables list the configurable parameters of the rancher-pushprox chart and their default values. - -### General - -#### Required -| Parameter | Description | Example | -| ----- | ----------- | ------ | -| `component` | The component that is being monitored | `kube-etcd` -| `metricsPort` | The port on the host that contains the metrics you want to scrape (e.g. `http://:/metrics`) | `2379` | -| `namespaceOverride` | The namespace to install the chart | `""` - -#### Optional -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `serviceMonitor.enabled` | Deploys a [Prometheus Operator](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor) ServiceMonitor CR that is configured to scrape metrics on the hosts that the clients are deployed on via the proxy. Also deploys a Service that points to all pods with the expected client name that exposes the `metricsPort` selected | `true` | -| `serviceMonitor.endpoints` | A list of endpoints that will be added to the ServiceMonitor based on the [Endpoint spec](https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint) | `[{port: metrics}]` | -| `service.selector` | The selector that is used to populate the Service's Endpoints object. The chart will error out on rendering templating if `.Values.clients.enabled` is set alongside this field, since it is expected that this service should point to the PushProx Clients Daemonset / Deployment | `{}` | -| `clients.enabled` | Deploys a DaemonSet of clients that are each capable of scraping endpoints on the hostNetwork it is deployed on | `true` | -| `clients.port` | The port where the client will publish PushProx client-specific metrics. If deploying multiple clients onto the same node, the clients should not have conflicting ports | `9369` | -| `clients.proxyUrl` | Overrides the default proxyUrl setting of `http://pushprox-{{ .Values.component }}-proxy.{{ . Release.Namespace }}.svc.cluster.local:{{ .Values.proxy.port }}"` with the `proxyUrl` specified | `""` | -| `clients.useLocalhost` | Sets a flag on each client deployment to redirect scrapes directed to `HOST_IP` to `127.0.0.1` | `false` | -| `clients.https.enabled` | Enables scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.forceHTTPSScheme` | Forces scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.useServiceAccountCredentials` | If set to true, the client will create a service account with permissions to scrape `/metrics` endpoint of Kubernetes components. The client will use the service account token provided to make authorized scrape requests to the Kubernetes API | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.enabled` | If set to true, the client will use service account credentials mounted at the configured path `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath`. This requires permissions to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath` | This is a volume mount on the pod with permissions to scrape `/metrics` endpoint of Kubernetes components | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | -| `clients.https.authenticationMethod.bearerTokenSecret.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.authorization.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components | `false` | -| `clients.https.authenticationMethod.authorization.type` | If set, the client will use this type of authorization in its client requests for metrics | `"bearer"` | -| `clients.https.authenticationMethod.authorization.credentials.key` | If set, the client will use this key in the secret created by `clients.https.useServiceAccountCredentials` for authorization in its client requests for metrics | `"token"` | -| `clients.https.authenticationMethod.authorization.credentials.optional` | If set to false, the client will fail if the key in the secret created by `clients.https.useServiceAccountCredentials` does not exist | `false` | -| `clients.https.insecureSkipVerify` | If set to true, the client will disable SSL security checks | `false` | -| `clients.https.certDir` | A `hostPath` where TLS certs can be found. This path is mounted as a volume on an `initContainer` which copies only the necessary files over to an EmptyDir volume used by each client. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.certFile` | The path to the TLS cert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.keyFile` | The path to the TLS key file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.caCertFile` | The path to the TLS cacert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.seLinuxOptions` | seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. | `""` | -| `clients.metrics.enabled` | Whether the client should publish PushProx client-specific metrics. | `false` | -| `clients.rbac.additionalRules` | Additional permissions to provide to the ServiceAccount bound to the client. This can be used to provide additional permissions for the client to scrape metrics from the k8s API. Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true | `[]` | -| `clients.deployment.enabled` | Deploys the client as a Deployment (generally used if the underlying hostNetwork Pod that is being scraped is managed by a Deployment) | `false` | -| `clients.deployment.replicas` | The number of pods the Deployment has, it should match the number of pod the hostNetwork Deployment has. Required and only used if `client.deployment.enable` is set | `0` | -| `clients.deployment.affinity` | The affinity rules that allocate the pod to the node in which the hostNetwork Deployment's pods run. Required and only used if `client.deployment.enable` is set | `{}` | -| `clients.resources` | Set resource limits and requests for the client container | `{}` | -| `clients.nodeSelector` | Select which nodes to deploy the clients on | `{}` | -| `clients.tolerations` | Specify tolerations for clients | `[]` | -| `proxy.enabled` | Deploys the proxy that each client will register with | `true` | -| `proxy.port` | The port exposed by the proxy that each client will register with to allow metrics to be scraped from the host | `8080` | -| `proxy.resources` | Set resource limits and requests for the proxy container | `{}` | -| `proxy.nodeSelector` | Select which nodes the proxy can be deployed on | `{}` | -| `proxy.tolerations` | Specify tolerations (if necessary) to allow the proxy to be deployed on the selected node | `[]` | -| `kubeVersionOverrides` | A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches any of the semver constraints provided as keys on the map. On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. | `[]` - -*Tip: The filepaths set in `clients.https.File` can include wildcard characters*. - -See [rancher-monitoring](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-monitoring) for examples of how this chart can be used. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/_helpers.tpl deleted file mode 100644 index 8e651dccfd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/_helpers.tpl +++ /dev/null @@ -1,166 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# General - -{{- define "applyKubeVersionOverrides" -}} -{{- $overrides := dict -}} -{{- range $override := .Values.kubeVersionOverrides -}} -{{- if semverCompare $override.constraint $.Capabilities.KubeVersion.Version -}} -{{- $_ := mergeOverwrite $overrides $override.values -}} -{{- end -}} -{{- end -}} -{{- $_ := mergeOverwrite .Values $overrides -}} -{{- end -}} - -{{- define "pushprox.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{- define "pushProxy.commonLabels" -}} -release: {{ .Release.Name }} -component: {{ .Values.component | quote }} -provider: kubernetes -{{- end -}} - -{{- define "pushProxy.proxyUrl" -}} -{{- $_ := (required "Template requires either .Values.proxy.port or .Values.client.proxyUrl to set proxyUrl for client" (or .Values.clients.proxyUrl .Values.proxy.port)) -}} -{{- if .Values.clients.proxyUrl -}} -{{ printf "%s" .Values.clients.proxyUrl }} -{{- else -}} -{{ printf "http://%s.%s.svc:%d" (include "pushProxy.proxy.name" .) (include "pushprox.namespace" .) (int .Values.proxy.port) }} -{{- end -}}{{- end -}} - -# Client - -{{- define "pushProxy.client.name" -}} -{{- printf "pushprox-%s-client" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.serviceAccountTokenName" -}} -{{- printf "pushprox-%s-client-service-account-token" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.labels" -}} -k8s-app: {{ template "pushProxy.client.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# Proxy - -{{- define "pushProxy.proxy.name" -}} -{{- printf "pushprox-%s-proxy" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.proxy.labels" -}} -k8s-app: {{ template "pushProxy.proxy.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# ServiceMonitor - -{{- define "pushprox.serviceMonitor.name" -}} -{{- printf "%s-%s" .Release.Name (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.labels" -}} -app: {{ template "pushprox.serviceMonitor.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.endpoints" -}} -{{- $proxyURL := (include "pushProxy.proxyUrl" .) -}} -{{- $useHTTPS := .Values.clients.https.enabled -}} -{{- $forceHTTPSScheme := .Values.clients.https.forceHTTPSScheme -}} -{{- $insecureSkipVerify := .Values.clients.https.insecureSkipVerify -}} -{{- $useServiceAccountCredentials := .Values.clients.https.useServiceAccountCredentials -}} -{{- $serviceAccountTokenName := (include "pushProxy.client.serviceAccountTokenName" . ) -}} -{{- $metricRelabelings := list }} -{{- $endpoints := .Values.serviceMonitor.endpoints }} -{{- range $endpoints }} -{{- if $.Values.proxy.enabled }} -{{- $_ := set . "proxyUrl" $proxyURL }} -{{- end }} -{{- $clusterIdRelabel := dict }} -{{- if $.Values.global.cattle.clusterId }} -{{- $_ := set $clusterIdRelabel "action" "replace" }} -{{- $_ := set $clusterIdRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterIdRelabel "targetLabel" "cluster_id" }} -{{- $_ := set $clusterIdRelabel "replacement" $.Values.global.cattle.clusterId }} -{{- end }} -{{- $clusterNameRelabel := dict }} -{{- if $.Values.global.cattle.clusterName }} -{{- $_ := set $clusterNameRelabel "action" "replace" }} -{{- $_ := set $clusterNameRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterNameRelabel "targetLabel" "cluster_name" }} -{{- $_ := set $clusterNameRelabel "replacement" $.Values.global.cattle.clusterName }} -{{- end }} -{{- $metricRelabelings := gt (len (keys $clusterNameRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterNameRelabel)) ($metricRelabelings) }} -{{- $metricRelabelings := gt (len (keys $clusterIdRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterIdRelabel)) ($metricRelabelings) }} -{{- if not (empty $metricRelabelings) }} -{{- $_ := set . "metricRelabelings" ($metricRelabelings)}} -{{- end }} -{{- if $forceHTTPSScheme -}} -{{- $_ := set . "scheme" "https" }} -{{- end -}} -{{- if $useHTTPS -}} -{{- if (hasKey . "params") }} -{{- $_ := set (get . "params") "_scheme" (list "https") }} -{{- else }} -{{- $_ := set . "params" (dict "_scheme" (list "https")) }} -{{- end }} -{{- end }} -{{- if (hasKey . "tlsConfig") }} -{{- $_ := set (get . "tlsConfig") "insecureSkipVerify" $insecureSkipVerify }} -{{- else }} -{{- $_ := set . "tlsConfig" (dict "insecureSkipVerify" $insecureSkipVerify) }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenFile.enabled }} -{{- $_ := set . "bearerTokenFile" $.Values.clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenSecret.enabled }} -{{- $_ := set . "bearerTokenSecret" $serviceAccountTokenName }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.authorization.enabled }} -{{- if (hasKey . "authorization") }} -{{- $_ := set (get . "authorization") "type" $.Values.clients.https.authenticationMethod.authorization.type }} -{{- $_ := set (get . "authorization") "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional) }} -{{- else }} -{{- $_ := set . "authorization" (dict "type" $.Values.clients.https.authenticationMethod.authorization.type) }} -{{- $_ := set . "authorization" (dict "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional)) }} -{{- end }} -{{- end }} -{{- end }} -{{- toYaml $endpoints }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-clients-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-clients-rbac.yaml deleted file mode 100644 index a8e27c3735..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-clients-rbac.yaml +++ /dev/null @@ -1,97 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.client.name" . }} -{{- end }} -{{- if and .Values.clients.https.enabled .Values.clients.https.useServiceAccountCredentials }} -- nonResourceURLs: ["/metrics"] - verbs: ["get"] -{{- if .Values.clients.rbac.additionalRules }} -{{ toYaml .Values.clients.rbac.additionalRules }} -{{- end }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.client.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} ---- -{{- if .Values.clients.https.useServiceAccountCredentials }} -apiVersion: v1 -kind: Secret -type: kubernetes.io/service-account-token -metadata: - name: {{ template "pushProxy.client.serviceAccountTokenName" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - annotations: - kubernetes.io/service-account.name: {{ template "pushProxy.client.name" . }} -{{- end }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: true - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 6 }} -{{- end }} - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - - 'emptyDir' - - 'hostPath' - allowedHostPaths: - - pathPrefix: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - readOnly: true -{{- end }} -{{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-clients.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-clients.yaml deleted file mode 100644 index e8fcfb3883..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-clients.yaml +++ /dev/null @@ -1,157 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: apps/v1 -{{- if .Values.clients.deployment.enabled }} -kind: Deployment -{{- else }} -kind: DaemonSet -{{- end }} -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - pushprox-exporter: "client" -spec: - {{- if .Values.clients.deployment.enabled }} - replicas: {{ .Values.clients.deployment.replicas }} - {{- end }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.client.labels" . | nindent 8 }} - spec: - {{- if .Values.clients.affinity }} - affinity: {{ toYaml .Values.clients.affinity | nindent 8 }} - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.clients.nodeSelector }} -{{ toYaml .Values.clients.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.clients.tolerations }} -{{ toYaml .Values.clients.tolerations | indent 8 }} -{{- end }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - serviceAccountName: {{ template "pushProxy.client.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-client - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - {{- range .Values.clients.command }} - - {{ . | quote }} - {{- end }} - args: - - --fqdn=$(HOST_IP) - - --proxy-url=$(PROXY_URL) - {{- if .Values.clients.metrics.enabled }} - - --metrics-addr=$(PORT) - {{- end }} - - --allow-port={{ required "Need .Values.metricsPort to configure client to be allowed to scrape metrics at port" .Values.metricsPort}} - {{- if .Values.clients.useLocalhost }} - - --use-localhost - {{- end }} - {{- if .Values.clients.https.enabled }} - {{- if .Values.clients.https.insecureSkipVerify }} - - --insecure-skip-verify - {{- end }} - {{- if .Values.clients.https.useServiceAccountCredentials }} - - --token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- end }} - {{- if .Values.clients.https.certDir }} - - --tls.cert=/etc/ssl/push-proxy/push-proxy.pem - - --tls.key=/etc/ssl/push-proxy/push-proxy-key.pem - - --tls.cacert=/etc/ssl/push-proxy/push-proxy-ca-cert.pem - {{- end }} - {{- end }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if .Values.clients.metrics.enabled }} - - name: PORT - value: :{{ .Values.clients.port }} - {{- end }} - - name: PROXY_URL - value: {{ template "pushProxy.proxyUrl" . }} - securityContext: - runAsNonRoot: true - runAsUser: 1000 - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - volumeMounts: - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - {{- end }} - {{- if .Values.clients.resources }} - resources: {{ toYaml .Values.clients.resources | nindent 10 }} - {{- end }} - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - initContainers: - - name: copy-certs - image: {{ template "system_default_registry" . }}{{ .Values.clients.copyCertsImage.repository }}:{{ .Values.clients.copyCertsImage.tag }} - command: - - sh - - -c - - | - echo "Searching for files to copy within the source volume" - echo "cert: ${CERT_FILE_NAME}" - echo "key: ${KEY_FILE_NAME}" - echo "cacert: ${CACERT_FILE_NAME}" - - CERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CERT_FILE_NAME}" | sort -r | head -n 1) - KEY_FILE_SOURCE=$(find /etc/source/ -type f -name "${KEY_FILE_NAME}" | sort -r | head -n 1) - CACERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CACERT_FILE_NAME}" | sort -r | head -n 1) - - test -z ${CERT_FILE_SOURCE} && echo "Failed to find cert file" && exit 1 - test -z ${KEY_FILE_SOURCE} && echo "Failed to find key file" && exit 1 - test -z ${CACERT_FILE_SOURCE} && echo "Failed to find cacert file" && exit 1 - - echo "Copying cert file from $CERT_FILE_SOURCE to $CERT_FILE_TARGET" - cp $CERT_FILE_SOURCE $CERT_FILE_TARGET || exit 1 - chmod 444 $CERT_FILE_TARGET || exit 1 - - echo "Copying key file from $KEY_FILE_SOURCE to $KEY_FILE_TARGET" - cp $KEY_FILE_SOURCE $KEY_FILE_TARGET || exit 1 - chmod 444 $KEY_FILE_TARGET || exit 1 - - echo "Copying cacert file from $CACERT_FILE_SOURCE to $CACERT_FILE_TARGET" - cp $CACERT_FILE_SOURCE $CACERT_FILE_TARGET || exit 1 - chmod 444 $CACERT_FILE_TARGET || exit 1 - env: - - name: CERT_FILE_NAME - value: {{ required "Need a TLS cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.certFile }} - - name: KEY_FILE_NAME - value: {{ required "Need a TLS key file for scraping metrics endpoint over HTTPs" .Values.clients.https.keyFile }} - - name: CACERT_FILE_NAME - value: {{ required "Need a TLS CA cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.caCertFile }} - - name: CERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy.pem - - name: KEY_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-key.pem - - name: CACERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-ca-cert.pem - securityContext: - runAsNonRoot: false -{{- if and .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 12 }} -{{- end }} - volumeMounts: - - name: metrics-cert-dir-source - mountPath: /etc/source - readOnly: true - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - volumes: - - name: metrics-cert-dir-source - hostPath: - path: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - - name: metrics-cert-dir - emptyDir: {} - {{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-proxy-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-proxy-rbac.yaml deleted file mode 100644 index eefe609058..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-proxy-rbac.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.proxy.name" . }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.proxy.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- end }}{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-proxy.yaml deleted file mode 100644 index 723bbd6c00..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-proxy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} - pushprox-exporter: "proxy" -spec: - selector: - matchLabels: {{ include "pushProxy.proxy.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.proxy.labels" . | nindent 8 }} - spec: - securityContext: - runAsNonRoot: true - runAsUser: 1000 - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.proxy.nodeSelector }} -{{ toYaml .Values.proxy.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.proxy.tolerations }} -{{ toYaml .Values.proxy.tolerations | indent 8 }} -{{- end }} - serviceAccountName: {{ template "pushProxy.proxy.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-proxy - image: {{ template "system_default_registry" . }}{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag }} - command: - {{- range .Values.proxy.command }} - - {{ . | quote }} - {{- end }} - {{- if .Values.proxy.resources }} - resources: {{ toYaml .Values.proxy.resources | nindent 10 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - ports: - - name: pp-proxy - port: {{ required "Need .Values.proxy.port to configure proxy" .Values.proxy.port }} - protocol: TCP - targetPort: {{ .Values.proxy.port }} - selector: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-servicemonitor.yaml deleted file mode 100644 index 67eb2216b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/pushprox-servicemonitor.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.serviceMonitor }}{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "pushprox.serviceMonitor.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.serviceMonitor.labels" . | nindent 4 }} -spec: - endpoints: {{include "pushProxy.serviceMonitor.endpoints" . | nindent 4 }} - jobLabel: component - podTargetLabels: - - component - - pushprox-exporter - namespaceSelector: - matchNames: - - {{ template "pushprox.namespace" . }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} ---- -{{- $selector := "" }} -{{- if not (kindIs "invalid" .Values.service) }} -{{- if not (kindIs "invalid" .Values.service.selector) }} -{{ if .Values.service.selector }} -{{- if .Values.clients.enabled }} -{{- required (printf "Cannot override .Values.service.selector=%s when .Values.clients.enabled=true" (toJson .Values.service.selector)) "" }} -{{- end }} -{{- $selector = (toYaml .Values.service.selector) }} -{{- end }} -{{- end }} -{{- end }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - ports: - - name: metrics - port: {{ required "Need .Values.metricsPort to configure client to listen to metrics at port" .Values.metricsPort}} - protocol: TCP - targetPort: {{ .Values.metricsPort }} - selector: {{ default (include "pushProxy.client.labels" .) $selector | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/validate-install-crd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/validate-install-crd.yaml deleted file mode 100644 index 16abc2fa83..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/validate-install-crd.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -# {{- $found := dict -}} -# {{- set $found "monitoring.coreos.com/v1/ServiceMonitor" false -}} -# {{- range .Capabilities.APIVersions -}} -# {{- if hasKey $found (toString .) -}} -# {{- set $found (toString .) true -}} -# {{- end -}} -# {{- end -}} -# {{- range $_, $exists := $found -}} -# {{- if (eq $exists false) -}} -# {{- required "Required CRDs are missing. Please install Prometheus Operator CRDs before installing this chart." "" -}} -# {{- end -}} -# {{- end -}} -#{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/validate-psp-install.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/values.yaml deleted file mode 100644 index 1e076041b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmControllerManager/values.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# Default values for rancher-pushprox. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Default image containing both the proxy and the client was generated from the following Dockerfile -# https://github.com/prometheus-community/PushProx/blob/eeadbe766641699129920ccfaaaa30a85c67fe81/Dockerfile#L1-L15 - -# Configuration - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - seLinux: - enabled: false - -# A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. -# -# For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches -# any of the semver constraints provided as keys on the map. -# -# On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. -# -# If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. -# -# Notes: -# - On running a helm template, Helm generally assumes the kubeVersion is v1.20.0 -# - On running a helm install --dry-run, the correct kubeVersion should be chosen. -kubeVersionOverrides: [] -# - constraint: "< 1.21" -# values: -# metricsPort: 10252 -# clients: -# https: -# enabled: false -# insecureSkipVerify: false -# useServiceAccountCredentials: false - -namespaceOverride: "" - -# The component that is being monitored (i.e. etcd) -component: "component" - -# The port containing the metrics that need to be scraped -metricsPort: 2739 - -# Configure ServiceMonitor that monitors metrics from the metricsPort endpoint -serviceMonitor: - enabled: true - # A list of endpoints that will be added to the ServiceMonitor based on the Endpoint spec - # Source: https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint - # By default, proxyUrl and params._scheme will be overridden based on other values - endpoints: - - port: metrics - -# Configure Service that grabs scrape targets -service: - # The selector that is used to populate the Service's Endpoints object. - # The chart will error out on rendering templating if .Values.clients.enabled is set alongside this field, - # since it is expected that this service should point to the PushProx Clients Daemonset / Deployment - selector: {} - -clients: - enabled: true - # The port which the PushProx client will post PushProx metrics to - port: 9369 - # If unset, this will default to the URL for the proxy service: http://pushprox-{{component}}-proxy.{{namepsace}}.svc.cluster.local:{{proxy.port}} - # Should be modified if the clients are being deployed outside the cluster where the proxy rests, otherwise leave it null - proxyUrl: "" - # If set to true, the client will forward any requests from the host IP to 127.0.0.1 - # It will only allow proxy requests to the metricsPort specified - useLocalhost: false - # Configuration for accessing metrics via HTTPS - https: - # Does the client require https to access the metrics? - enabled: false - # Does the client require requests be sent to http or https? - forceHTTPSScheme: false - # If set to true, the client will create a service account with adequate permissions and set a flag - # on the client to use the service account token provided by it to make authorized scrape requests - useServiceAccountCredentials: false - # Configuration for authentication to metrics via https endpoint - authenticationMethod: - # Reads token from defined file in container - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenFile: - enabled: false - bearerTokenFilePath: "/var/run/secrets/kubernetes.io/serviceaccount/token" - # Reads token from defined secret in namespace - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenSecret: - enabled: false - # Reads token from defined secret in namespace - authorization: - enabled: false - type: "bearer" - credentials: - key: "token" - optional: false - # If set to true, the client will disable SSL security checks - insecureSkipVerify: false - # Directory on host where necessary TLS cert and key to scrape metrics can be found - certDir: "" - # Filenames for files located in .Values.clients.https.certDir that correspond to TLS settings - certFile: "" - keyFile: "" - caCertFile: "" - # seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. - # Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. - seLinuxOptions: {} - - metrics: - # Whether the client should publish PushProx client-specific metrics to .Values.clients.port - enabled: false - - rbac: - # Additional permissions to provide to the ServiceAccount bound to the client - # This can be used to provide additional permissions for the client to scrape metrics from the k8s API - # Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true - additionalRules: [] - - # Resource limits - resources: {} - - # Options to select all nodes to deploy client DaemonSet on - nodeSelector: {} - tolerations: [] - affinity: {} - - image: - repository: rancher/pushprox-client - tag: v0.1.3-rancher2-client - command: ["pushprox-client"] - - copyCertsImage: - repository: rancher/mirrored-library-busybox - tag: 1.31.1 - - # The default intention of rancher-pushprox clients is to scrape hostNetwork metrics across all nodes. - # This can be used to scrape internal Kubernetes components or DaemonSets of hostNetwork Pods in - # situations where a cloud provider firewall prevents Pod-To-Host communication but not Pod-To-Pod. - # However, if the underlying hostNetwork Pod that is being scraped is managed by a Deployment, - # this advanced option enables users to deploy the client as a Deployment instead of a DaemonSet. - # If a user deploys this feature and the underlying Deployment's number of replicas changes, the user will - # be responsible for upgrading this chart accordingly to the right number of replicas. - deployment: - enabled: false - replicas: 0 - -proxy: - enabled: true - # The port through which PushProx clients will communicate to the proxy - port: 8080 - - # Resource limits - resources: {} - - # Options to select a node to run a single proxy deployment on - nodeSelector: {} - tolerations: [] - - image: - repository: rancher/pushprox-proxy - tag: v0.1.3-rancher2-proxy - command: ["pushprox-proxy"] diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/Chart.yaml deleted file mode 100644 index 64667094ae..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/Chart.yaml +++ /dev/null @@ -1,14 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.29.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-pushprox -apiVersion: v1 -appVersion: 0.1.0 -description: Sets up a deployment of the PushProx proxy and a DaemonSet of PushProx - clients. -name: kubeAdmEtcd -type: application -version: 0.2.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/README.md deleted file mode 100644 index 345002f48a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# rancher-pushprox - -A Rancher chart based on Rancher [PushProx](https://github.com/rancher/PushProx) that sets up a Deployment of a PushProx proxy and a DaemonSet of PushProx clients on a Kubernetes cluster. - -Installs [rancher-pushprox](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-pushprox) to create PushProx clients that can access their host's network and register with a PushProx proxy. A [Prometheus Operator](https://github.com/coreos/prometheus-operator) ServiceMonitor CR is also included that is configured to scrape the metrics from each of the clients through the proxy. - -Using an instance of this chart is suitable for the following scenarios: -- You need to scrape metrics from a port that should not be accessible outside of the host (e.g. scraping `etcd` metrics in a hardened cluster) -- You need to scrape metrics on a host that are not exposed outside of 127.0.0.1 (e.g. scraping `kube-proxy` metrics) -- You need to scrape metrics through HTTPS using certs hosted directly on `hostPath` -- You need to scrape metrics from Kubernetes components that require authorization via a service account (e.g. permissions to make request to `/metrics`) -- You need to scrape metrics without access to cacerts (i.e. enable `insecureSkipVerify`) - -The clients and proxy are created based on a Rancher fork of the [prometheus-community/PushProx](https://github.com/prometheus-community/PushProx) project. - -## Upgrading to Kubernetes v1.25+ - -Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. - -As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `global.cattle.psp.enabled` set to `false` if it has been previously set to `true`. -​ -> **Note:** -> In this chart release, any previous field that was associated with any PSP resources have been removed in favor of a single global field: `global.cattle.psp.enabled`. - -> **Note:** -> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** -> -> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. - -Upon setting `global.cattle.psp.enabled` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. - -As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. - -## Configuration - -The following tables list the configurable parameters of the rancher-pushprox chart and their default values. - -### General - -#### Required -| Parameter | Description | Example | -| ----- | ----------- | ------ | -| `component` | The component that is being monitored | `kube-etcd` -| `metricsPort` | The port on the host that contains the metrics you want to scrape (e.g. `http://:/metrics`) | `2379` | -| `namespaceOverride` | The namespace to install the chart | `""` - -#### Optional -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `serviceMonitor.enabled` | Deploys a [Prometheus Operator](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor) ServiceMonitor CR that is configured to scrape metrics on the hosts that the clients are deployed on via the proxy. Also deploys a Service that points to all pods with the expected client name that exposes the `metricsPort` selected | `true` | -| `serviceMonitor.endpoints` | A list of endpoints that will be added to the ServiceMonitor based on the [Endpoint spec](https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint) | `[{port: metrics}]` | -| `service.selector` | The selector that is used to populate the Service's Endpoints object. The chart will error out on rendering templating if `.Values.clients.enabled` is set alongside this field, since it is expected that this service should point to the PushProx Clients Daemonset / Deployment | `{}` | -| `clients.enabled` | Deploys a DaemonSet of clients that are each capable of scraping endpoints on the hostNetwork it is deployed on | `true` | -| `clients.port` | The port where the client will publish PushProx client-specific metrics. If deploying multiple clients onto the same node, the clients should not have conflicting ports | `9369` | -| `clients.proxyUrl` | Overrides the default proxyUrl setting of `http://pushprox-{{ .Values.component }}-proxy.{{ . Release.Namespace }}.svc.cluster.local:{{ .Values.proxy.port }}"` with the `proxyUrl` specified | `""` | -| `clients.useLocalhost` | Sets a flag on each client deployment to redirect scrapes directed to `HOST_IP` to `127.0.0.1` | `false` | -| `clients.https.enabled` | Enables scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.forceHTTPSScheme` | Forces scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.useServiceAccountCredentials` | If set to true, the client will create a service account with permissions to scrape `/metrics` endpoint of Kubernetes components. The client will use the service account token provided to make authorized scrape requests to the Kubernetes API | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.enabled` | If set to true, the client will use service account credentials mounted at the configured path `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath`. This requires permissions to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath` | This is a volume mount on the pod with permissions to scrape `/metrics` endpoint of Kubernetes components | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | -| `clients.https.authenticationMethod.bearerTokenSecret.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.authorization.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components | `false` | -| `clients.https.authenticationMethod.authorization.type` | If set, the client will use this type of authorization in its client requests for metrics | `"bearer"` | -| `clients.https.authenticationMethod.authorization.credentials.key` | If set, the client will use this key in the secret created by `clients.https.useServiceAccountCredentials` for authorization in its client requests for metrics | `"token"` | -| `clients.https.authenticationMethod.authorization.credentials.optional` | If set to false, the client will fail if the key in the secret created by `clients.https.useServiceAccountCredentials` does not exist | `false` | -| `clients.https.insecureSkipVerify` | If set to true, the client will disable SSL security checks | `false` | -| `clients.https.certDir` | A `hostPath` where TLS certs can be found. This path is mounted as a volume on an `initContainer` which copies only the necessary files over to an EmptyDir volume used by each client. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.certFile` | The path to the TLS cert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.keyFile` | The path to the TLS key file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.caCertFile` | The path to the TLS cacert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.seLinuxOptions` | seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. | `""` | -| `clients.metrics.enabled` | Whether the client should publish PushProx client-specific metrics. | `false` | -| `clients.rbac.additionalRules` | Additional permissions to provide to the ServiceAccount bound to the client. This can be used to provide additional permissions for the client to scrape metrics from the k8s API. Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true | `[]` | -| `clients.deployment.enabled` | Deploys the client as a Deployment (generally used if the underlying hostNetwork Pod that is being scraped is managed by a Deployment) | `false` | -| `clients.deployment.replicas` | The number of pods the Deployment has, it should match the number of pod the hostNetwork Deployment has. Required and only used if `client.deployment.enable` is set | `0` | -| `clients.deployment.affinity` | The affinity rules that allocate the pod to the node in which the hostNetwork Deployment's pods run. Required and only used if `client.deployment.enable` is set | `{}` | -| `clients.resources` | Set resource limits and requests for the client container | `{}` | -| `clients.nodeSelector` | Select which nodes to deploy the clients on | `{}` | -| `clients.tolerations` | Specify tolerations for clients | `[]` | -| `proxy.enabled` | Deploys the proxy that each client will register with | `true` | -| `proxy.port` | The port exposed by the proxy that each client will register with to allow metrics to be scraped from the host | `8080` | -| `proxy.resources` | Set resource limits and requests for the proxy container | `{}` | -| `proxy.nodeSelector` | Select which nodes the proxy can be deployed on | `{}` | -| `proxy.tolerations` | Specify tolerations (if necessary) to allow the proxy to be deployed on the selected node | `[]` | -| `kubeVersionOverrides` | A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches any of the semver constraints provided as keys on the map. On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. | `[]` - -*Tip: The filepaths set in `clients.https.File` can include wildcard characters*. - -See [rancher-monitoring](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-monitoring) for examples of how this chart can be used. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/_helpers.tpl deleted file mode 100644 index 8e651dccfd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/_helpers.tpl +++ /dev/null @@ -1,166 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# General - -{{- define "applyKubeVersionOverrides" -}} -{{- $overrides := dict -}} -{{- range $override := .Values.kubeVersionOverrides -}} -{{- if semverCompare $override.constraint $.Capabilities.KubeVersion.Version -}} -{{- $_ := mergeOverwrite $overrides $override.values -}} -{{- end -}} -{{- end -}} -{{- $_ := mergeOverwrite .Values $overrides -}} -{{- end -}} - -{{- define "pushprox.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{- define "pushProxy.commonLabels" -}} -release: {{ .Release.Name }} -component: {{ .Values.component | quote }} -provider: kubernetes -{{- end -}} - -{{- define "pushProxy.proxyUrl" -}} -{{- $_ := (required "Template requires either .Values.proxy.port or .Values.client.proxyUrl to set proxyUrl for client" (or .Values.clients.proxyUrl .Values.proxy.port)) -}} -{{- if .Values.clients.proxyUrl -}} -{{ printf "%s" .Values.clients.proxyUrl }} -{{- else -}} -{{ printf "http://%s.%s.svc:%d" (include "pushProxy.proxy.name" .) (include "pushprox.namespace" .) (int .Values.proxy.port) }} -{{- end -}}{{- end -}} - -# Client - -{{- define "pushProxy.client.name" -}} -{{- printf "pushprox-%s-client" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.serviceAccountTokenName" -}} -{{- printf "pushprox-%s-client-service-account-token" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.labels" -}} -k8s-app: {{ template "pushProxy.client.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# Proxy - -{{- define "pushProxy.proxy.name" -}} -{{- printf "pushprox-%s-proxy" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.proxy.labels" -}} -k8s-app: {{ template "pushProxy.proxy.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# ServiceMonitor - -{{- define "pushprox.serviceMonitor.name" -}} -{{- printf "%s-%s" .Release.Name (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.labels" -}} -app: {{ template "pushprox.serviceMonitor.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.endpoints" -}} -{{- $proxyURL := (include "pushProxy.proxyUrl" .) -}} -{{- $useHTTPS := .Values.clients.https.enabled -}} -{{- $forceHTTPSScheme := .Values.clients.https.forceHTTPSScheme -}} -{{- $insecureSkipVerify := .Values.clients.https.insecureSkipVerify -}} -{{- $useServiceAccountCredentials := .Values.clients.https.useServiceAccountCredentials -}} -{{- $serviceAccountTokenName := (include "pushProxy.client.serviceAccountTokenName" . ) -}} -{{- $metricRelabelings := list }} -{{- $endpoints := .Values.serviceMonitor.endpoints }} -{{- range $endpoints }} -{{- if $.Values.proxy.enabled }} -{{- $_ := set . "proxyUrl" $proxyURL }} -{{- end }} -{{- $clusterIdRelabel := dict }} -{{- if $.Values.global.cattle.clusterId }} -{{- $_ := set $clusterIdRelabel "action" "replace" }} -{{- $_ := set $clusterIdRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterIdRelabel "targetLabel" "cluster_id" }} -{{- $_ := set $clusterIdRelabel "replacement" $.Values.global.cattle.clusterId }} -{{- end }} -{{- $clusterNameRelabel := dict }} -{{- if $.Values.global.cattle.clusterName }} -{{- $_ := set $clusterNameRelabel "action" "replace" }} -{{- $_ := set $clusterNameRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterNameRelabel "targetLabel" "cluster_name" }} -{{- $_ := set $clusterNameRelabel "replacement" $.Values.global.cattle.clusterName }} -{{- end }} -{{- $metricRelabelings := gt (len (keys $clusterNameRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterNameRelabel)) ($metricRelabelings) }} -{{- $metricRelabelings := gt (len (keys $clusterIdRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterIdRelabel)) ($metricRelabelings) }} -{{- if not (empty $metricRelabelings) }} -{{- $_ := set . "metricRelabelings" ($metricRelabelings)}} -{{- end }} -{{- if $forceHTTPSScheme -}} -{{- $_ := set . "scheme" "https" }} -{{- end -}} -{{- if $useHTTPS -}} -{{- if (hasKey . "params") }} -{{- $_ := set (get . "params") "_scheme" (list "https") }} -{{- else }} -{{- $_ := set . "params" (dict "_scheme" (list "https")) }} -{{- end }} -{{- end }} -{{- if (hasKey . "tlsConfig") }} -{{- $_ := set (get . "tlsConfig") "insecureSkipVerify" $insecureSkipVerify }} -{{- else }} -{{- $_ := set . "tlsConfig" (dict "insecureSkipVerify" $insecureSkipVerify) }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenFile.enabled }} -{{- $_ := set . "bearerTokenFile" $.Values.clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenSecret.enabled }} -{{- $_ := set . "bearerTokenSecret" $serviceAccountTokenName }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.authorization.enabled }} -{{- if (hasKey . "authorization") }} -{{- $_ := set (get . "authorization") "type" $.Values.clients.https.authenticationMethod.authorization.type }} -{{- $_ := set (get . "authorization") "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional) }} -{{- else }} -{{- $_ := set . "authorization" (dict "type" $.Values.clients.https.authenticationMethod.authorization.type) }} -{{- $_ := set . "authorization" (dict "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional)) }} -{{- end }} -{{- end }} -{{- end }} -{{- toYaml $endpoints }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-clients-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-clients-rbac.yaml deleted file mode 100644 index a8e27c3735..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-clients-rbac.yaml +++ /dev/null @@ -1,97 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.client.name" . }} -{{- end }} -{{- if and .Values.clients.https.enabled .Values.clients.https.useServiceAccountCredentials }} -- nonResourceURLs: ["/metrics"] - verbs: ["get"] -{{- if .Values.clients.rbac.additionalRules }} -{{ toYaml .Values.clients.rbac.additionalRules }} -{{- end }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.client.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} ---- -{{- if .Values.clients.https.useServiceAccountCredentials }} -apiVersion: v1 -kind: Secret -type: kubernetes.io/service-account-token -metadata: - name: {{ template "pushProxy.client.serviceAccountTokenName" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - annotations: - kubernetes.io/service-account.name: {{ template "pushProxy.client.name" . }} -{{- end }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: true - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 6 }} -{{- end }} - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - - 'emptyDir' - - 'hostPath' - allowedHostPaths: - - pathPrefix: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - readOnly: true -{{- end }} -{{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-clients.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-clients.yaml deleted file mode 100644 index e8fcfb3883..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-clients.yaml +++ /dev/null @@ -1,157 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: apps/v1 -{{- if .Values.clients.deployment.enabled }} -kind: Deployment -{{- else }} -kind: DaemonSet -{{- end }} -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - pushprox-exporter: "client" -spec: - {{- if .Values.clients.deployment.enabled }} - replicas: {{ .Values.clients.deployment.replicas }} - {{- end }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.client.labels" . | nindent 8 }} - spec: - {{- if .Values.clients.affinity }} - affinity: {{ toYaml .Values.clients.affinity | nindent 8 }} - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.clients.nodeSelector }} -{{ toYaml .Values.clients.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.clients.tolerations }} -{{ toYaml .Values.clients.tolerations | indent 8 }} -{{- end }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - serviceAccountName: {{ template "pushProxy.client.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-client - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - {{- range .Values.clients.command }} - - {{ . | quote }} - {{- end }} - args: - - --fqdn=$(HOST_IP) - - --proxy-url=$(PROXY_URL) - {{- if .Values.clients.metrics.enabled }} - - --metrics-addr=$(PORT) - {{- end }} - - --allow-port={{ required "Need .Values.metricsPort to configure client to be allowed to scrape metrics at port" .Values.metricsPort}} - {{- if .Values.clients.useLocalhost }} - - --use-localhost - {{- end }} - {{- if .Values.clients.https.enabled }} - {{- if .Values.clients.https.insecureSkipVerify }} - - --insecure-skip-verify - {{- end }} - {{- if .Values.clients.https.useServiceAccountCredentials }} - - --token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- end }} - {{- if .Values.clients.https.certDir }} - - --tls.cert=/etc/ssl/push-proxy/push-proxy.pem - - --tls.key=/etc/ssl/push-proxy/push-proxy-key.pem - - --tls.cacert=/etc/ssl/push-proxy/push-proxy-ca-cert.pem - {{- end }} - {{- end }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if .Values.clients.metrics.enabled }} - - name: PORT - value: :{{ .Values.clients.port }} - {{- end }} - - name: PROXY_URL - value: {{ template "pushProxy.proxyUrl" . }} - securityContext: - runAsNonRoot: true - runAsUser: 1000 - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - volumeMounts: - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - {{- end }} - {{- if .Values.clients.resources }} - resources: {{ toYaml .Values.clients.resources | nindent 10 }} - {{- end }} - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - initContainers: - - name: copy-certs - image: {{ template "system_default_registry" . }}{{ .Values.clients.copyCertsImage.repository }}:{{ .Values.clients.copyCertsImage.tag }} - command: - - sh - - -c - - | - echo "Searching for files to copy within the source volume" - echo "cert: ${CERT_FILE_NAME}" - echo "key: ${KEY_FILE_NAME}" - echo "cacert: ${CACERT_FILE_NAME}" - - CERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CERT_FILE_NAME}" | sort -r | head -n 1) - KEY_FILE_SOURCE=$(find /etc/source/ -type f -name "${KEY_FILE_NAME}" | sort -r | head -n 1) - CACERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CACERT_FILE_NAME}" | sort -r | head -n 1) - - test -z ${CERT_FILE_SOURCE} && echo "Failed to find cert file" && exit 1 - test -z ${KEY_FILE_SOURCE} && echo "Failed to find key file" && exit 1 - test -z ${CACERT_FILE_SOURCE} && echo "Failed to find cacert file" && exit 1 - - echo "Copying cert file from $CERT_FILE_SOURCE to $CERT_FILE_TARGET" - cp $CERT_FILE_SOURCE $CERT_FILE_TARGET || exit 1 - chmod 444 $CERT_FILE_TARGET || exit 1 - - echo "Copying key file from $KEY_FILE_SOURCE to $KEY_FILE_TARGET" - cp $KEY_FILE_SOURCE $KEY_FILE_TARGET || exit 1 - chmod 444 $KEY_FILE_TARGET || exit 1 - - echo "Copying cacert file from $CACERT_FILE_SOURCE to $CACERT_FILE_TARGET" - cp $CACERT_FILE_SOURCE $CACERT_FILE_TARGET || exit 1 - chmod 444 $CACERT_FILE_TARGET || exit 1 - env: - - name: CERT_FILE_NAME - value: {{ required "Need a TLS cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.certFile }} - - name: KEY_FILE_NAME - value: {{ required "Need a TLS key file for scraping metrics endpoint over HTTPs" .Values.clients.https.keyFile }} - - name: CACERT_FILE_NAME - value: {{ required "Need a TLS CA cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.caCertFile }} - - name: CERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy.pem - - name: KEY_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-key.pem - - name: CACERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-ca-cert.pem - securityContext: - runAsNonRoot: false -{{- if and .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 12 }} -{{- end }} - volumeMounts: - - name: metrics-cert-dir-source - mountPath: /etc/source - readOnly: true - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - volumes: - - name: metrics-cert-dir-source - hostPath: - path: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - - name: metrics-cert-dir - emptyDir: {} - {{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-proxy-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-proxy-rbac.yaml deleted file mode 100644 index eefe609058..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-proxy-rbac.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.proxy.name" . }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.proxy.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- end }}{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-proxy.yaml deleted file mode 100644 index 723bbd6c00..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-proxy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} - pushprox-exporter: "proxy" -spec: - selector: - matchLabels: {{ include "pushProxy.proxy.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.proxy.labels" . | nindent 8 }} - spec: - securityContext: - runAsNonRoot: true - runAsUser: 1000 - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.proxy.nodeSelector }} -{{ toYaml .Values.proxy.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.proxy.tolerations }} -{{ toYaml .Values.proxy.tolerations | indent 8 }} -{{- end }} - serviceAccountName: {{ template "pushProxy.proxy.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-proxy - image: {{ template "system_default_registry" . }}{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag }} - command: - {{- range .Values.proxy.command }} - - {{ . | quote }} - {{- end }} - {{- if .Values.proxy.resources }} - resources: {{ toYaml .Values.proxy.resources | nindent 10 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - ports: - - name: pp-proxy - port: {{ required "Need .Values.proxy.port to configure proxy" .Values.proxy.port }} - protocol: TCP - targetPort: {{ .Values.proxy.port }} - selector: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-servicemonitor.yaml deleted file mode 100644 index 67eb2216b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/pushprox-servicemonitor.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.serviceMonitor }}{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "pushprox.serviceMonitor.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.serviceMonitor.labels" . | nindent 4 }} -spec: - endpoints: {{include "pushProxy.serviceMonitor.endpoints" . | nindent 4 }} - jobLabel: component - podTargetLabels: - - component - - pushprox-exporter - namespaceSelector: - matchNames: - - {{ template "pushprox.namespace" . }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} ---- -{{- $selector := "" }} -{{- if not (kindIs "invalid" .Values.service) }} -{{- if not (kindIs "invalid" .Values.service.selector) }} -{{ if .Values.service.selector }} -{{- if .Values.clients.enabled }} -{{- required (printf "Cannot override .Values.service.selector=%s when .Values.clients.enabled=true" (toJson .Values.service.selector)) "" }} -{{- end }} -{{- $selector = (toYaml .Values.service.selector) }} -{{- end }} -{{- end }} -{{- end }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - ports: - - name: metrics - port: {{ required "Need .Values.metricsPort to configure client to listen to metrics at port" .Values.metricsPort}} - protocol: TCP - targetPort: {{ .Values.metricsPort }} - selector: {{ default (include "pushProxy.client.labels" .) $selector | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/validate-install-crd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/validate-install-crd.yaml deleted file mode 100644 index 16abc2fa83..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/validate-install-crd.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -# {{- $found := dict -}} -# {{- set $found "monitoring.coreos.com/v1/ServiceMonitor" false -}} -# {{- range .Capabilities.APIVersions -}} -# {{- if hasKey $found (toString .) -}} -# {{- set $found (toString .) true -}} -# {{- end -}} -# {{- end -}} -# {{- range $_, $exists := $found -}} -# {{- if (eq $exists false) -}} -# {{- required "Required CRDs are missing. Please install Prometheus Operator CRDs before installing this chart." "" -}} -# {{- end -}} -# {{- end -}} -#{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/validate-psp-install.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/values.yaml deleted file mode 100644 index 1e076041b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmEtcd/values.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# Default values for rancher-pushprox. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Default image containing both the proxy and the client was generated from the following Dockerfile -# https://github.com/prometheus-community/PushProx/blob/eeadbe766641699129920ccfaaaa30a85c67fe81/Dockerfile#L1-L15 - -# Configuration - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - seLinux: - enabled: false - -# A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. -# -# For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches -# any of the semver constraints provided as keys on the map. -# -# On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. -# -# If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. -# -# Notes: -# - On running a helm template, Helm generally assumes the kubeVersion is v1.20.0 -# - On running a helm install --dry-run, the correct kubeVersion should be chosen. -kubeVersionOverrides: [] -# - constraint: "< 1.21" -# values: -# metricsPort: 10252 -# clients: -# https: -# enabled: false -# insecureSkipVerify: false -# useServiceAccountCredentials: false - -namespaceOverride: "" - -# The component that is being monitored (i.e. etcd) -component: "component" - -# The port containing the metrics that need to be scraped -metricsPort: 2739 - -# Configure ServiceMonitor that monitors metrics from the metricsPort endpoint -serviceMonitor: - enabled: true - # A list of endpoints that will be added to the ServiceMonitor based on the Endpoint spec - # Source: https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint - # By default, proxyUrl and params._scheme will be overridden based on other values - endpoints: - - port: metrics - -# Configure Service that grabs scrape targets -service: - # The selector that is used to populate the Service's Endpoints object. - # The chart will error out on rendering templating if .Values.clients.enabled is set alongside this field, - # since it is expected that this service should point to the PushProx Clients Daemonset / Deployment - selector: {} - -clients: - enabled: true - # The port which the PushProx client will post PushProx metrics to - port: 9369 - # If unset, this will default to the URL for the proxy service: http://pushprox-{{component}}-proxy.{{namepsace}}.svc.cluster.local:{{proxy.port}} - # Should be modified if the clients are being deployed outside the cluster where the proxy rests, otherwise leave it null - proxyUrl: "" - # If set to true, the client will forward any requests from the host IP to 127.0.0.1 - # It will only allow proxy requests to the metricsPort specified - useLocalhost: false - # Configuration for accessing metrics via HTTPS - https: - # Does the client require https to access the metrics? - enabled: false - # Does the client require requests be sent to http or https? - forceHTTPSScheme: false - # If set to true, the client will create a service account with adequate permissions and set a flag - # on the client to use the service account token provided by it to make authorized scrape requests - useServiceAccountCredentials: false - # Configuration for authentication to metrics via https endpoint - authenticationMethod: - # Reads token from defined file in container - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenFile: - enabled: false - bearerTokenFilePath: "/var/run/secrets/kubernetes.io/serviceaccount/token" - # Reads token from defined secret in namespace - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenSecret: - enabled: false - # Reads token from defined secret in namespace - authorization: - enabled: false - type: "bearer" - credentials: - key: "token" - optional: false - # If set to true, the client will disable SSL security checks - insecureSkipVerify: false - # Directory on host where necessary TLS cert and key to scrape metrics can be found - certDir: "" - # Filenames for files located in .Values.clients.https.certDir that correspond to TLS settings - certFile: "" - keyFile: "" - caCertFile: "" - # seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. - # Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. - seLinuxOptions: {} - - metrics: - # Whether the client should publish PushProx client-specific metrics to .Values.clients.port - enabled: false - - rbac: - # Additional permissions to provide to the ServiceAccount bound to the client - # This can be used to provide additional permissions for the client to scrape metrics from the k8s API - # Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true - additionalRules: [] - - # Resource limits - resources: {} - - # Options to select all nodes to deploy client DaemonSet on - nodeSelector: {} - tolerations: [] - affinity: {} - - image: - repository: rancher/pushprox-client - tag: v0.1.3-rancher2-client - command: ["pushprox-client"] - - copyCertsImage: - repository: rancher/mirrored-library-busybox - tag: 1.31.1 - - # The default intention of rancher-pushprox clients is to scrape hostNetwork metrics across all nodes. - # This can be used to scrape internal Kubernetes components or DaemonSets of hostNetwork Pods in - # situations where a cloud provider firewall prevents Pod-To-Host communication but not Pod-To-Pod. - # However, if the underlying hostNetwork Pod that is being scraped is managed by a Deployment, - # this advanced option enables users to deploy the client as a Deployment instead of a DaemonSet. - # If a user deploys this feature and the underlying Deployment's number of replicas changes, the user will - # be responsible for upgrading this chart accordingly to the right number of replicas. - deployment: - enabled: false - replicas: 0 - -proxy: - enabled: true - # The port through which PushProx clients will communicate to the proxy - port: 8080 - - # Resource limits - resources: {} - - # Options to select a node to run a single proxy deployment on - nodeSelector: {} - tolerations: [] - - image: - repository: rancher/pushprox-proxy - tag: v0.1.3-rancher2-proxy - command: ["pushprox-proxy"] diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/Chart.yaml deleted file mode 100644 index a1cfd979b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/Chart.yaml +++ /dev/null @@ -1,14 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.29.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-pushprox -apiVersion: v1 -appVersion: 0.1.0 -description: Sets up a deployment of the PushProx proxy and a DaemonSet of PushProx - clients. -name: kubeAdmProxy -type: application -version: 0.2.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/README.md deleted file mode 100644 index 345002f48a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# rancher-pushprox - -A Rancher chart based on Rancher [PushProx](https://github.com/rancher/PushProx) that sets up a Deployment of a PushProx proxy and a DaemonSet of PushProx clients on a Kubernetes cluster. - -Installs [rancher-pushprox](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-pushprox) to create PushProx clients that can access their host's network and register with a PushProx proxy. A [Prometheus Operator](https://github.com/coreos/prometheus-operator) ServiceMonitor CR is also included that is configured to scrape the metrics from each of the clients through the proxy. - -Using an instance of this chart is suitable for the following scenarios: -- You need to scrape metrics from a port that should not be accessible outside of the host (e.g. scraping `etcd` metrics in a hardened cluster) -- You need to scrape metrics on a host that are not exposed outside of 127.0.0.1 (e.g. scraping `kube-proxy` metrics) -- You need to scrape metrics through HTTPS using certs hosted directly on `hostPath` -- You need to scrape metrics from Kubernetes components that require authorization via a service account (e.g. permissions to make request to `/metrics`) -- You need to scrape metrics without access to cacerts (i.e. enable `insecureSkipVerify`) - -The clients and proxy are created based on a Rancher fork of the [prometheus-community/PushProx](https://github.com/prometheus-community/PushProx) project. - -## Upgrading to Kubernetes v1.25+ - -Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. - -As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `global.cattle.psp.enabled` set to `false` if it has been previously set to `true`. -​ -> **Note:** -> In this chart release, any previous field that was associated with any PSP resources have been removed in favor of a single global field: `global.cattle.psp.enabled`. - -> **Note:** -> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** -> -> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. - -Upon setting `global.cattle.psp.enabled` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. - -As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. - -## Configuration - -The following tables list the configurable parameters of the rancher-pushprox chart and their default values. - -### General - -#### Required -| Parameter | Description | Example | -| ----- | ----------- | ------ | -| `component` | The component that is being monitored | `kube-etcd` -| `metricsPort` | The port on the host that contains the metrics you want to scrape (e.g. `http://:/metrics`) | `2379` | -| `namespaceOverride` | The namespace to install the chart | `""` - -#### Optional -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `serviceMonitor.enabled` | Deploys a [Prometheus Operator](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor) ServiceMonitor CR that is configured to scrape metrics on the hosts that the clients are deployed on via the proxy. Also deploys a Service that points to all pods with the expected client name that exposes the `metricsPort` selected | `true` | -| `serviceMonitor.endpoints` | A list of endpoints that will be added to the ServiceMonitor based on the [Endpoint spec](https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint) | `[{port: metrics}]` | -| `service.selector` | The selector that is used to populate the Service's Endpoints object. The chart will error out on rendering templating if `.Values.clients.enabled` is set alongside this field, since it is expected that this service should point to the PushProx Clients Daemonset / Deployment | `{}` | -| `clients.enabled` | Deploys a DaemonSet of clients that are each capable of scraping endpoints on the hostNetwork it is deployed on | `true` | -| `clients.port` | The port where the client will publish PushProx client-specific metrics. If deploying multiple clients onto the same node, the clients should not have conflicting ports | `9369` | -| `clients.proxyUrl` | Overrides the default proxyUrl setting of `http://pushprox-{{ .Values.component }}-proxy.{{ . Release.Namespace }}.svc.cluster.local:{{ .Values.proxy.port }}"` with the `proxyUrl` specified | `""` | -| `clients.useLocalhost` | Sets a flag on each client deployment to redirect scrapes directed to `HOST_IP` to `127.0.0.1` | `false` | -| `clients.https.enabled` | Enables scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.forceHTTPSScheme` | Forces scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.useServiceAccountCredentials` | If set to true, the client will create a service account with permissions to scrape `/metrics` endpoint of Kubernetes components. The client will use the service account token provided to make authorized scrape requests to the Kubernetes API | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.enabled` | If set to true, the client will use service account credentials mounted at the configured path `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath`. This requires permissions to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath` | This is a volume mount on the pod with permissions to scrape `/metrics` endpoint of Kubernetes components | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | -| `clients.https.authenticationMethod.bearerTokenSecret.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.authorization.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components | `false` | -| `clients.https.authenticationMethod.authorization.type` | If set, the client will use this type of authorization in its client requests for metrics | `"bearer"` | -| `clients.https.authenticationMethod.authorization.credentials.key` | If set, the client will use this key in the secret created by `clients.https.useServiceAccountCredentials` for authorization in its client requests for metrics | `"token"` | -| `clients.https.authenticationMethod.authorization.credentials.optional` | If set to false, the client will fail if the key in the secret created by `clients.https.useServiceAccountCredentials` does not exist | `false` | -| `clients.https.insecureSkipVerify` | If set to true, the client will disable SSL security checks | `false` | -| `clients.https.certDir` | A `hostPath` where TLS certs can be found. This path is mounted as a volume on an `initContainer` which copies only the necessary files over to an EmptyDir volume used by each client. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.certFile` | The path to the TLS cert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.keyFile` | The path to the TLS key file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.caCertFile` | The path to the TLS cacert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.seLinuxOptions` | seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. | `""` | -| `clients.metrics.enabled` | Whether the client should publish PushProx client-specific metrics. | `false` | -| `clients.rbac.additionalRules` | Additional permissions to provide to the ServiceAccount bound to the client. This can be used to provide additional permissions for the client to scrape metrics from the k8s API. Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true | `[]` | -| `clients.deployment.enabled` | Deploys the client as a Deployment (generally used if the underlying hostNetwork Pod that is being scraped is managed by a Deployment) | `false` | -| `clients.deployment.replicas` | The number of pods the Deployment has, it should match the number of pod the hostNetwork Deployment has. Required and only used if `client.deployment.enable` is set | `0` | -| `clients.deployment.affinity` | The affinity rules that allocate the pod to the node in which the hostNetwork Deployment's pods run. Required and only used if `client.deployment.enable` is set | `{}` | -| `clients.resources` | Set resource limits and requests for the client container | `{}` | -| `clients.nodeSelector` | Select which nodes to deploy the clients on | `{}` | -| `clients.tolerations` | Specify tolerations for clients | `[]` | -| `proxy.enabled` | Deploys the proxy that each client will register with | `true` | -| `proxy.port` | The port exposed by the proxy that each client will register with to allow metrics to be scraped from the host | `8080` | -| `proxy.resources` | Set resource limits and requests for the proxy container | `{}` | -| `proxy.nodeSelector` | Select which nodes the proxy can be deployed on | `{}` | -| `proxy.tolerations` | Specify tolerations (if necessary) to allow the proxy to be deployed on the selected node | `[]` | -| `kubeVersionOverrides` | A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches any of the semver constraints provided as keys on the map. On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. | `[]` - -*Tip: The filepaths set in `clients.https.File` can include wildcard characters*. - -See [rancher-monitoring](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-monitoring) for examples of how this chart can be used. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/_helpers.tpl deleted file mode 100644 index 8e651dccfd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/_helpers.tpl +++ /dev/null @@ -1,166 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# General - -{{- define "applyKubeVersionOverrides" -}} -{{- $overrides := dict -}} -{{- range $override := .Values.kubeVersionOverrides -}} -{{- if semverCompare $override.constraint $.Capabilities.KubeVersion.Version -}} -{{- $_ := mergeOverwrite $overrides $override.values -}} -{{- end -}} -{{- end -}} -{{- $_ := mergeOverwrite .Values $overrides -}} -{{- end -}} - -{{- define "pushprox.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{- define "pushProxy.commonLabels" -}} -release: {{ .Release.Name }} -component: {{ .Values.component | quote }} -provider: kubernetes -{{- end -}} - -{{- define "pushProxy.proxyUrl" -}} -{{- $_ := (required "Template requires either .Values.proxy.port or .Values.client.proxyUrl to set proxyUrl for client" (or .Values.clients.proxyUrl .Values.proxy.port)) -}} -{{- if .Values.clients.proxyUrl -}} -{{ printf "%s" .Values.clients.proxyUrl }} -{{- else -}} -{{ printf "http://%s.%s.svc:%d" (include "pushProxy.proxy.name" .) (include "pushprox.namespace" .) (int .Values.proxy.port) }} -{{- end -}}{{- end -}} - -# Client - -{{- define "pushProxy.client.name" -}} -{{- printf "pushprox-%s-client" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.serviceAccountTokenName" -}} -{{- printf "pushprox-%s-client-service-account-token" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.labels" -}} -k8s-app: {{ template "pushProxy.client.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# Proxy - -{{- define "pushProxy.proxy.name" -}} -{{- printf "pushprox-%s-proxy" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.proxy.labels" -}} -k8s-app: {{ template "pushProxy.proxy.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# ServiceMonitor - -{{- define "pushprox.serviceMonitor.name" -}} -{{- printf "%s-%s" .Release.Name (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.labels" -}} -app: {{ template "pushprox.serviceMonitor.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.endpoints" -}} -{{- $proxyURL := (include "pushProxy.proxyUrl" .) -}} -{{- $useHTTPS := .Values.clients.https.enabled -}} -{{- $forceHTTPSScheme := .Values.clients.https.forceHTTPSScheme -}} -{{- $insecureSkipVerify := .Values.clients.https.insecureSkipVerify -}} -{{- $useServiceAccountCredentials := .Values.clients.https.useServiceAccountCredentials -}} -{{- $serviceAccountTokenName := (include "pushProxy.client.serviceAccountTokenName" . ) -}} -{{- $metricRelabelings := list }} -{{- $endpoints := .Values.serviceMonitor.endpoints }} -{{- range $endpoints }} -{{- if $.Values.proxy.enabled }} -{{- $_ := set . "proxyUrl" $proxyURL }} -{{- end }} -{{- $clusterIdRelabel := dict }} -{{- if $.Values.global.cattle.clusterId }} -{{- $_ := set $clusterIdRelabel "action" "replace" }} -{{- $_ := set $clusterIdRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterIdRelabel "targetLabel" "cluster_id" }} -{{- $_ := set $clusterIdRelabel "replacement" $.Values.global.cattle.clusterId }} -{{- end }} -{{- $clusterNameRelabel := dict }} -{{- if $.Values.global.cattle.clusterName }} -{{- $_ := set $clusterNameRelabel "action" "replace" }} -{{- $_ := set $clusterNameRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterNameRelabel "targetLabel" "cluster_name" }} -{{- $_ := set $clusterNameRelabel "replacement" $.Values.global.cattle.clusterName }} -{{- end }} -{{- $metricRelabelings := gt (len (keys $clusterNameRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterNameRelabel)) ($metricRelabelings) }} -{{- $metricRelabelings := gt (len (keys $clusterIdRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterIdRelabel)) ($metricRelabelings) }} -{{- if not (empty $metricRelabelings) }} -{{- $_ := set . "metricRelabelings" ($metricRelabelings)}} -{{- end }} -{{- if $forceHTTPSScheme -}} -{{- $_ := set . "scheme" "https" }} -{{- end -}} -{{- if $useHTTPS -}} -{{- if (hasKey . "params") }} -{{- $_ := set (get . "params") "_scheme" (list "https") }} -{{- else }} -{{- $_ := set . "params" (dict "_scheme" (list "https")) }} -{{- end }} -{{- end }} -{{- if (hasKey . "tlsConfig") }} -{{- $_ := set (get . "tlsConfig") "insecureSkipVerify" $insecureSkipVerify }} -{{- else }} -{{- $_ := set . "tlsConfig" (dict "insecureSkipVerify" $insecureSkipVerify) }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenFile.enabled }} -{{- $_ := set . "bearerTokenFile" $.Values.clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenSecret.enabled }} -{{- $_ := set . "bearerTokenSecret" $serviceAccountTokenName }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.authorization.enabled }} -{{- if (hasKey . "authorization") }} -{{- $_ := set (get . "authorization") "type" $.Values.clients.https.authenticationMethod.authorization.type }} -{{- $_ := set (get . "authorization") "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional) }} -{{- else }} -{{- $_ := set . "authorization" (dict "type" $.Values.clients.https.authenticationMethod.authorization.type) }} -{{- $_ := set . "authorization" (dict "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional)) }} -{{- end }} -{{- end }} -{{- end }} -{{- toYaml $endpoints }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-clients-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-clients-rbac.yaml deleted file mode 100644 index a8e27c3735..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-clients-rbac.yaml +++ /dev/null @@ -1,97 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.client.name" . }} -{{- end }} -{{- if and .Values.clients.https.enabled .Values.clients.https.useServiceAccountCredentials }} -- nonResourceURLs: ["/metrics"] - verbs: ["get"] -{{- if .Values.clients.rbac.additionalRules }} -{{ toYaml .Values.clients.rbac.additionalRules }} -{{- end }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.client.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} ---- -{{- if .Values.clients.https.useServiceAccountCredentials }} -apiVersion: v1 -kind: Secret -type: kubernetes.io/service-account-token -metadata: - name: {{ template "pushProxy.client.serviceAccountTokenName" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - annotations: - kubernetes.io/service-account.name: {{ template "pushProxy.client.name" . }} -{{- end }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: true - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 6 }} -{{- end }} - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - - 'emptyDir' - - 'hostPath' - allowedHostPaths: - - pathPrefix: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - readOnly: true -{{- end }} -{{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-clients.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-clients.yaml deleted file mode 100644 index e8fcfb3883..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-clients.yaml +++ /dev/null @@ -1,157 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: apps/v1 -{{- if .Values.clients.deployment.enabled }} -kind: Deployment -{{- else }} -kind: DaemonSet -{{- end }} -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - pushprox-exporter: "client" -spec: - {{- if .Values.clients.deployment.enabled }} - replicas: {{ .Values.clients.deployment.replicas }} - {{- end }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.client.labels" . | nindent 8 }} - spec: - {{- if .Values.clients.affinity }} - affinity: {{ toYaml .Values.clients.affinity | nindent 8 }} - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.clients.nodeSelector }} -{{ toYaml .Values.clients.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.clients.tolerations }} -{{ toYaml .Values.clients.tolerations | indent 8 }} -{{- end }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - serviceAccountName: {{ template "pushProxy.client.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-client - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - {{- range .Values.clients.command }} - - {{ . | quote }} - {{- end }} - args: - - --fqdn=$(HOST_IP) - - --proxy-url=$(PROXY_URL) - {{- if .Values.clients.metrics.enabled }} - - --metrics-addr=$(PORT) - {{- end }} - - --allow-port={{ required "Need .Values.metricsPort to configure client to be allowed to scrape metrics at port" .Values.metricsPort}} - {{- if .Values.clients.useLocalhost }} - - --use-localhost - {{- end }} - {{- if .Values.clients.https.enabled }} - {{- if .Values.clients.https.insecureSkipVerify }} - - --insecure-skip-verify - {{- end }} - {{- if .Values.clients.https.useServiceAccountCredentials }} - - --token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- end }} - {{- if .Values.clients.https.certDir }} - - --tls.cert=/etc/ssl/push-proxy/push-proxy.pem - - --tls.key=/etc/ssl/push-proxy/push-proxy-key.pem - - --tls.cacert=/etc/ssl/push-proxy/push-proxy-ca-cert.pem - {{- end }} - {{- end }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if .Values.clients.metrics.enabled }} - - name: PORT - value: :{{ .Values.clients.port }} - {{- end }} - - name: PROXY_URL - value: {{ template "pushProxy.proxyUrl" . }} - securityContext: - runAsNonRoot: true - runAsUser: 1000 - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - volumeMounts: - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - {{- end }} - {{- if .Values.clients.resources }} - resources: {{ toYaml .Values.clients.resources | nindent 10 }} - {{- end }} - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - initContainers: - - name: copy-certs - image: {{ template "system_default_registry" . }}{{ .Values.clients.copyCertsImage.repository }}:{{ .Values.clients.copyCertsImage.tag }} - command: - - sh - - -c - - | - echo "Searching for files to copy within the source volume" - echo "cert: ${CERT_FILE_NAME}" - echo "key: ${KEY_FILE_NAME}" - echo "cacert: ${CACERT_FILE_NAME}" - - CERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CERT_FILE_NAME}" | sort -r | head -n 1) - KEY_FILE_SOURCE=$(find /etc/source/ -type f -name "${KEY_FILE_NAME}" | sort -r | head -n 1) - CACERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CACERT_FILE_NAME}" | sort -r | head -n 1) - - test -z ${CERT_FILE_SOURCE} && echo "Failed to find cert file" && exit 1 - test -z ${KEY_FILE_SOURCE} && echo "Failed to find key file" && exit 1 - test -z ${CACERT_FILE_SOURCE} && echo "Failed to find cacert file" && exit 1 - - echo "Copying cert file from $CERT_FILE_SOURCE to $CERT_FILE_TARGET" - cp $CERT_FILE_SOURCE $CERT_FILE_TARGET || exit 1 - chmod 444 $CERT_FILE_TARGET || exit 1 - - echo "Copying key file from $KEY_FILE_SOURCE to $KEY_FILE_TARGET" - cp $KEY_FILE_SOURCE $KEY_FILE_TARGET || exit 1 - chmod 444 $KEY_FILE_TARGET || exit 1 - - echo "Copying cacert file from $CACERT_FILE_SOURCE to $CACERT_FILE_TARGET" - cp $CACERT_FILE_SOURCE $CACERT_FILE_TARGET || exit 1 - chmod 444 $CACERT_FILE_TARGET || exit 1 - env: - - name: CERT_FILE_NAME - value: {{ required "Need a TLS cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.certFile }} - - name: KEY_FILE_NAME - value: {{ required "Need a TLS key file for scraping metrics endpoint over HTTPs" .Values.clients.https.keyFile }} - - name: CACERT_FILE_NAME - value: {{ required "Need a TLS CA cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.caCertFile }} - - name: CERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy.pem - - name: KEY_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-key.pem - - name: CACERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-ca-cert.pem - securityContext: - runAsNonRoot: false -{{- if and .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 12 }} -{{- end }} - volumeMounts: - - name: metrics-cert-dir-source - mountPath: /etc/source - readOnly: true - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - volumes: - - name: metrics-cert-dir-source - hostPath: - path: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - - name: metrics-cert-dir - emptyDir: {} - {{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-proxy-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-proxy-rbac.yaml deleted file mode 100644 index eefe609058..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-proxy-rbac.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.proxy.name" . }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.proxy.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- end }}{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-proxy.yaml deleted file mode 100644 index 723bbd6c00..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-proxy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} - pushprox-exporter: "proxy" -spec: - selector: - matchLabels: {{ include "pushProxy.proxy.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.proxy.labels" . | nindent 8 }} - spec: - securityContext: - runAsNonRoot: true - runAsUser: 1000 - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.proxy.nodeSelector }} -{{ toYaml .Values.proxy.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.proxy.tolerations }} -{{ toYaml .Values.proxy.tolerations | indent 8 }} -{{- end }} - serviceAccountName: {{ template "pushProxy.proxy.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-proxy - image: {{ template "system_default_registry" . }}{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag }} - command: - {{- range .Values.proxy.command }} - - {{ . | quote }} - {{- end }} - {{- if .Values.proxy.resources }} - resources: {{ toYaml .Values.proxy.resources | nindent 10 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - ports: - - name: pp-proxy - port: {{ required "Need .Values.proxy.port to configure proxy" .Values.proxy.port }} - protocol: TCP - targetPort: {{ .Values.proxy.port }} - selector: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-servicemonitor.yaml deleted file mode 100644 index 67eb2216b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/pushprox-servicemonitor.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.serviceMonitor }}{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "pushprox.serviceMonitor.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.serviceMonitor.labels" . | nindent 4 }} -spec: - endpoints: {{include "pushProxy.serviceMonitor.endpoints" . | nindent 4 }} - jobLabel: component - podTargetLabels: - - component - - pushprox-exporter - namespaceSelector: - matchNames: - - {{ template "pushprox.namespace" . }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} ---- -{{- $selector := "" }} -{{- if not (kindIs "invalid" .Values.service) }} -{{- if not (kindIs "invalid" .Values.service.selector) }} -{{ if .Values.service.selector }} -{{- if .Values.clients.enabled }} -{{- required (printf "Cannot override .Values.service.selector=%s when .Values.clients.enabled=true" (toJson .Values.service.selector)) "" }} -{{- end }} -{{- $selector = (toYaml .Values.service.selector) }} -{{- end }} -{{- end }} -{{- end }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - ports: - - name: metrics - port: {{ required "Need .Values.metricsPort to configure client to listen to metrics at port" .Values.metricsPort}} - protocol: TCP - targetPort: {{ .Values.metricsPort }} - selector: {{ default (include "pushProxy.client.labels" .) $selector | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/validate-install-crd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/validate-install-crd.yaml deleted file mode 100644 index 16abc2fa83..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/validate-install-crd.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -# {{- $found := dict -}} -# {{- set $found "monitoring.coreos.com/v1/ServiceMonitor" false -}} -# {{- range .Capabilities.APIVersions -}} -# {{- if hasKey $found (toString .) -}} -# {{- set $found (toString .) true -}} -# {{- end -}} -# {{- end -}} -# {{- range $_, $exists := $found -}} -# {{- if (eq $exists false) -}} -# {{- required "Required CRDs are missing. Please install Prometheus Operator CRDs before installing this chart." "" -}} -# {{- end -}} -# {{- end -}} -#{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/validate-psp-install.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/values.yaml deleted file mode 100644 index 1e076041b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmProxy/values.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# Default values for rancher-pushprox. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Default image containing both the proxy and the client was generated from the following Dockerfile -# https://github.com/prometheus-community/PushProx/blob/eeadbe766641699129920ccfaaaa30a85c67fe81/Dockerfile#L1-L15 - -# Configuration - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - seLinux: - enabled: false - -# A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. -# -# For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches -# any of the semver constraints provided as keys on the map. -# -# On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. -# -# If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. -# -# Notes: -# - On running a helm template, Helm generally assumes the kubeVersion is v1.20.0 -# - On running a helm install --dry-run, the correct kubeVersion should be chosen. -kubeVersionOverrides: [] -# - constraint: "< 1.21" -# values: -# metricsPort: 10252 -# clients: -# https: -# enabled: false -# insecureSkipVerify: false -# useServiceAccountCredentials: false - -namespaceOverride: "" - -# The component that is being monitored (i.e. etcd) -component: "component" - -# The port containing the metrics that need to be scraped -metricsPort: 2739 - -# Configure ServiceMonitor that monitors metrics from the metricsPort endpoint -serviceMonitor: - enabled: true - # A list of endpoints that will be added to the ServiceMonitor based on the Endpoint spec - # Source: https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint - # By default, proxyUrl and params._scheme will be overridden based on other values - endpoints: - - port: metrics - -# Configure Service that grabs scrape targets -service: - # The selector that is used to populate the Service's Endpoints object. - # The chart will error out on rendering templating if .Values.clients.enabled is set alongside this field, - # since it is expected that this service should point to the PushProx Clients Daemonset / Deployment - selector: {} - -clients: - enabled: true - # The port which the PushProx client will post PushProx metrics to - port: 9369 - # If unset, this will default to the URL for the proxy service: http://pushprox-{{component}}-proxy.{{namepsace}}.svc.cluster.local:{{proxy.port}} - # Should be modified if the clients are being deployed outside the cluster where the proxy rests, otherwise leave it null - proxyUrl: "" - # If set to true, the client will forward any requests from the host IP to 127.0.0.1 - # It will only allow proxy requests to the metricsPort specified - useLocalhost: false - # Configuration for accessing metrics via HTTPS - https: - # Does the client require https to access the metrics? - enabled: false - # Does the client require requests be sent to http or https? - forceHTTPSScheme: false - # If set to true, the client will create a service account with adequate permissions and set a flag - # on the client to use the service account token provided by it to make authorized scrape requests - useServiceAccountCredentials: false - # Configuration for authentication to metrics via https endpoint - authenticationMethod: - # Reads token from defined file in container - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenFile: - enabled: false - bearerTokenFilePath: "/var/run/secrets/kubernetes.io/serviceaccount/token" - # Reads token from defined secret in namespace - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenSecret: - enabled: false - # Reads token from defined secret in namespace - authorization: - enabled: false - type: "bearer" - credentials: - key: "token" - optional: false - # If set to true, the client will disable SSL security checks - insecureSkipVerify: false - # Directory on host where necessary TLS cert and key to scrape metrics can be found - certDir: "" - # Filenames for files located in .Values.clients.https.certDir that correspond to TLS settings - certFile: "" - keyFile: "" - caCertFile: "" - # seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. - # Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. - seLinuxOptions: {} - - metrics: - # Whether the client should publish PushProx client-specific metrics to .Values.clients.port - enabled: false - - rbac: - # Additional permissions to provide to the ServiceAccount bound to the client - # This can be used to provide additional permissions for the client to scrape metrics from the k8s API - # Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true - additionalRules: [] - - # Resource limits - resources: {} - - # Options to select all nodes to deploy client DaemonSet on - nodeSelector: {} - tolerations: [] - affinity: {} - - image: - repository: rancher/pushprox-client - tag: v0.1.3-rancher2-client - command: ["pushprox-client"] - - copyCertsImage: - repository: rancher/mirrored-library-busybox - tag: 1.31.1 - - # The default intention of rancher-pushprox clients is to scrape hostNetwork metrics across all nodes. - # This can be used to scrape internal Kubernetes components or DaemonSets of hostNetwork Pods in - # situations where a cloud provider firewall prevents Pod-To-Host communication but not Pod-To-Pod. - # However, if the underlying hostNetwork Pod that is being scraped is managed by a Deployment, - # this advanced option enables users to deploy the client as a Deployment instead of a DaemonSet. - # If a user deploys this feature and the underlying Deployment's number of replicas changes, the user will - # be responsible for upgrading this chart accordingly to the right number of replicas. - deployment: - enabled: false - replicas: 0 - -proxy: - enabled: true - # The port through which PushProx clients will communicate to the proxy - port: 8080 - - # Resource limits - resources: {} - - # Options to select a node to run a single proxy deployment on - nodeSelector: {} - tolerations: [] - - image: - repository: rancher/pushprox-proxy - tag: v0.1.3-rancher2-proxy - command: ["pushprox-proxy"] diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/Chart.yaml deleted file mode 100644 index 6e2211c51c..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/Chart.yaml +++ /dev/null @@ -1,14 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.29.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-pushprox -apiVersion: v1 -appVersion: 0.1.0 -description: Sets up a deployment of the PushProx proxy and a DaemonSet of PushProx - clients. -name: kubeAdmScheduler -type: application -version: 0.2.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/README.md deleted file mode 100644 index 345002f48a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# rancher-pushprox - -A Rancher chart based on Rancher [PushProx](https://github.com/rancher/PushProx) that sets up a Deployment of a PushProx proxy and a DaemonSet of PushProx clients on a Kubernetes cluster. - -Installs [rancher-pushprox](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-pushprox) to create PushProx clients that can access their host's network and register with a PushProx proxy. A [Prometheus Operator](https://github.com/coreos/prometheus-operator) ServiceMonitor CR is also included that is configured to scrape the metrics from each of the clients through the proxy. - -Using an instance of this chart is suitable for the following scenarios: -- You need to scrape metrics from a port that should not be accessible outside of the host (e.g. scraping `etcd` metrics in a hardened cluster) -- You need to scrape metrics on a host that are not exposed outside of 127.0.0.1 (e.g. scraping `kube-proxy` metrics) -- You need to scrape metrics through HTTPS using certs hosted directly on `hostPath` -- You need to scrape metrics from Kubernetes components that require authorization via a service account (e.g. permissions to make request to `/metrics`) -- You need to scrape metrics without access to cacerts (i.e. enable `insecureSkipVerify`) - -The clients and proxy are created based on a Rancher fork of the [prometheus-community/PushProx](https://github.com/prometheus-community/PushProx) project. - -## Upgrading to Kubernetes v1.25+ - -Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. - -As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `global.cattle.psp.enabled` set to `false` if it has been previously set to `true`. -​ -> **Note:** -> In this chart release, any previous field that was associated with any PSP resources have been removed in favor of a single global field: `global.cattle.psp.enabled`. - -> **Note:** -> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** -> -> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. - -Upon setting `global.cattle.psp.enabled` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. - -As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. - -## Configuration - -The following tables list the configurable parameters of the rancher-pushprox chart and their default values. - -### General - -#### Required -| Parameter | Description | Example | -| ----- | ----------- | ------ | -| `component` | The component that is being monitored | `kube-etcd` -| `metricsPort` | The port on the host that contains the metrics you want to scrape (e.g. `http://:/metrics`) | `2379` | -| `namespaceOverride` | The namespace to install the chart | `""` - -#### Optional -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `serviceMonitor.enabled` | Deploys a [Prometheus Operator](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor) ServiceMonitor CR that is configured to scrape metrics on the hosts that the clients are deployed on via the proxy. Also deploys a Service that points to all pods with the expected client name that exposes the `metricsPort` selected | `true` | -| `serviceMonitor.endpoints` | A list of endpoints that will be added to the ServiceMonitor based on the [Endpoint spec](https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint) | `[{port: metrics}]` | -| `service.selector` | The selector that is used to populate the Service's Endpoints object. The chart will error out on rendering templating if `.Values.clients.enabled` is set alongside this field, since it is expected that this service should point to the PushProx Clients Daemonset / Deployment | `{}` | -| `clients.enabled` | Deploys a DaemonSet of clients that are each capable of scraping endpoints on the hostNetwork it is deployed on | `true` | -| `clients.port` | The port where the client will publish PushProx client-specific metrics. If deploying multiple clients onto the same node, the clients should not have conflicting ports | `9369` | -| `clients.proxyUrl` | Overrides the default proxyUrl setting of `http://pushprox-{{ .Values.component }}-proxy.{{ . Release.Namespace }}.svc.cluster.local:{{ .Values.proxy.port }}"` with the `proxyUrl` specified | `""` | -| `clients.useLocalhost` | Sets a flag on each client deployment to redirect scrapes directed to `HOST_IP` to `127.0.0.1` | `false` | -| `clients.https.enabled` | Enables scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.forceHTTPSScheme` | Forces scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.useServiceAccountCredentials` | If set to true, the client will create a service account with permissions to scrape `/metrics` endpoint of Kubernetes components. The client will use the service account token provided to make authorized scrape requests to the Kubernetes API | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.enabled` | If set to true, the client will use service account credentials mounted at the configured path `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath`. This requires permissions to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath` | This is a volume mount on the pod with permissions to scrape `/metrics` endpoint of Kubernetes components | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | -| `clients.https.authenticationMethod.bearerTokenSecret.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.authorization.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components | `false` | -| `clients.https.authenticationMethod.authorization.type` | If set, the client will use this type of authorization in its client requests for metrics | `"bearer"` | -| `clients.https.authenticationMethod.authorization.credentials.key` | If set, the client will use this key in the secret created by `clients.https.useServiceAccountCredentials` for authorization in its client requests for metrics | `"token"` | -| `clients.https.authenticationMethod.authorization.credentials.optional` | If set to false, the client will fail if the key in the secret created by `clients.https.useServiceAccountCredentials` does not exist | `false` | -| `clients.https.insecureSkipVerify` | If set to true, the client will disable SSL security checks | `false` | -| `clients.https.certDir` | A `hostPath` where TLS certs can be found. This path is mounted as a volume on an `initContainer` which copies only the necessary files over to an EmptyDir volume used by each client. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.certFile` | The path to the TLS cert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.keyFile` | The path to the TLS key file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.caCertFile` | The path to the TLS cacert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.seLinuxOptions` | seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. | `""` | -| `clients.metrics.enabled` | Whether the client should publish PushProx client-specific metrics. | `false` | -| `clients.rbac.additionalRules` | Additional permissions to provide to the ServiceAccount bound to the client. This can be used to provide additional permissions for the client to scrape metrics from the k8s API. Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true | `[]` | -| `clients.deployment.enabled` | Deploys the client as a Deployment (generally used if the underlying hostNetwork Pod that is being scraped is managed by a Deployment) | `false` | -| `clients.deployment.replicas` | The number of pods the Deployment has, it should match the number of pod the hostNetwork Deployment has. Required and only used if `client.deployment.enable` is set | `0` | -| `clients.deployment.affinity` | The affinity rules that allocate the pod to the node in which the hostNetwork Deployment's pods run. Required and only used if `client.deployment.enable` is set | `{}` | -| `clients.resources` | Set resource limits and requests for the client container | `{}` | -| `clients.nodeSelector` | Select which nodes to deploy the clients on | `{}` | -| `clients.tolerations` | Specify tolerations for clients | `[]` | -| `proxy.enabled` | Deploys the proxy that each client will register with | `true` | -| `proxy.port` | The port exposed by the proxy that each client will register with to allow metrics to be scraped from the host | `8080` | -| `proxy.resources` | Set resource limits and requests for the proxy container | `{}` | -| `proxy.nodeSelector` | Select which nodes the proxy can be deployed on | `{}` | -| `proxy.tolerations` | Specify tolerations (if necessary) to allow the proxy to be deployed on the selected node | `[]` | -| `kubeVersionOverrides` | A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches any of the semver constraints provided as keys on the map. On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. | `[]` - -*Tip: The filepaths set in `clients.https.File` can include wildcard characters*. - -See [rancher-monitoring](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-monitoring) for examples of how this chart can be used. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/_helpers.tpl deleted file mode 100644 index 8e651dccfd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/_helpers.tpl +++ /dev/null @@ -1,166 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# General - -{{- define "applyKubeVersionOverrides" -}} -{{- $overrides := dict -}} -{{- range $override := .Values.kubeVersionOverrides -}} -{{- if semverCompare $override.constraint $.Capabilities.KubeVersion.Version -}} -{{- $_ := mergeOverwrite $overrides $override.values -}} -{{- end -}} -{{- end -}} -{{- $_ := mergeOverwrite .Values $overrides -}} -{{- end -}} - -{{- define "pushprox.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{- define "pushProxy.commonLabels" -}} -release: {{ .Release.Name }} -component: {{ .Values.component | quote }} -provider: kubernetes -{{- end -}} - -{{- define "pushProxy.proxyUrl" -}} -{{- $_ := (required "Template requires either .Values.proxy.port or .Values.client.proxyUrl to set proxyUrl for client" (or .Values.clients.proxyUrl .Values.proxy.port)) -}} -{{- if .Values.clients.proxyUrl -}} -{{ printf "%s" .Values.clients.proxyUrl }} -{{- else -}} -{{ printf "http://%s.%s.svc:%d" (include "pushProxy.proxy.name" .) (include "pushprox.namespace" .) (int .Values.proxy.port) }} -{{- end -}}{{- end -}} - -# Client - -{{- define "pushProxy.client.name" -}} -{{- printf "pushprox-%s-client" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.serviceAccountTokenName" -}} -{{- printf "pushprox-%s-client-service-account-token" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.labels" -}} -k8s-app: {{ template "pushProxy.client.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# Proxy - -{{- define "pushProxy.proxy.name" -}} -{{- printf "pushprox-%s-proxy" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.proxy.labels" -}} -k8s-app: {{ template "pushProxy.proxy.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# ServiceMonitor - -{{- define "pushprox.serviceMonitor.name" -}} -{{- printf "%s-%s" .Release.Name (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.labels" -}} -app: {{ template "pushprox.serviceMonitor.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.endpoints" -}} -{{- $proxyURL := (include "pushProxy.proxyUrl" .) -}} -{{- $useHTTPS := .Values.clients.https.enabled -}} -{{- $forceHTTPSScheme := .Values.clients.https.forceHTTPSScheme -}} -{{- $insecureSkipVerify := .Values.clients.https.insecureSkipVerify -}} -{{- $useServiceAccountCredentials := .Values.clients.https.useServiceAccountCredentials -}} -{{- $serviceAccountTokenName := (include "pushProxy.client.serviceAccountTokenName" . ) -}} -{{- $metricRelabelings := list }} -{{- $endpoints := .Values.serviceMonitor.endpoints }} -{{- range $endpoints }} -{{- if $.Values.proxy.enabled }} -{{- $_ := set . "proxyUrl" $proxyURL }} -{{- end }} -{{- $clusterIdRelabel := dict }} -{{- if $.Values.global.cattle.clusterId }} -{{- $_ := set $clusterIdRelabel "action" "replace" }} -{{- $_ := set $clusterIdRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterIdRelabel "targetLabel" "cluster_id" }} -{{- $_ := set $clusterIdRelabel "replacement" $.Values.global.cattle.clusterId }} -{{- end }} -{{- $clusterNameRelabel := dict }} -{{- if $.Values.global.cattle.clusterName }} -{{- $_ := set $clusterNameRelabel "action" "replace" }} -{{- $_ := set $clusterNameRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterNameRelabel "targetLabel" "cluster_name" }} -{{- $_ := set $clusterNameRelabel "replacement" $.Values.global.cattle.clusterName }} -{{- end }} -{{- $metricRelabelings := gt (len (keys $clusterNameRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterNameRelabel)) ($metricRelabelings) }} -{{- $metricRelabelings := gt (len (keys $clusterIdRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterIdRelabel)) ($metricRelabelings) }} -{{- if not (empty $metricRelabelings) }} -{{- $_ := set . "metricRelabelings" ($metricRelabelings)}} -{{- end }} -{{- if $forceHTTPSScheme -}} -{{- $_ := set . "scheme" "https" }} -{{- end -}} -{{- if $useHTTPS -}} -{{- if (hasKey . "params") }} -{{- $_ := set (get . "params") "_scheme" (list "https") }} -{{- else }} -{{- $_ := set . "params" (dict "_scheme" (list "https")) }} -{{- end }} -{{- end }} -{{- if (hasKey . "tlsConfig") }} -{{- $_ := set (get . "tlsConfig") "insecureSkipVerify" $insecureSkipVerify }} -{{- else }} -{{- $_ := set . "tlsConfig" (dict "insecureSkipVerify" $insecureSkipVerify) }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenFile.enabled }} -{{- $_ := set . "bearerTokenFile" $.Values.clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenSecret.enabled }} -{{- $_ := set . "bearerTokenSecret" $serviceAccountTokenName }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.authorization.enabled }} -{{- if (hasKey . "authorization") }} -{{- $_ := set (get . "authorization") "type" $.Values.clients.https.authenticationMethod.authorization.type }} -{{- $_ := set (get . "authorization") "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional) }} -{{- else }} -{{- $_ := set . "authorization" (dict "type" $.Values.clients.https.authenticationMethod.authorization.type) }} -{{- $_ := set . "authorization" (dict "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional)) }} -{{- end }} -{{- end }} -{{- end }} -{{- toYaml $endpoints }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-clients-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-clients-rbac.yaml deleted file mode 100644 index a8e27c3735..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-clients-rbac.yaml +++ /dev/null @@ -1,97 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.client.name" . }} -{{- end }} -{{- if and .Values.clients.https.enabled .Values.clients.https.useServiceAccountCredentials }} -- nonResourceURLs: ["/metrics"] - verbs: ["get"] -{{- if .Values.clients.rbac.additionalRules }} -{{ toYaml .Values.clients.rbac.additionalRules }} -{{- end }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.client.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} ---- -{{- if .Values.clients.https.useServiceAccountCredentials }} -apiVersion: v1 -kind: Secret -type: kubernetes.io/service-account-token -metadata: - name: {{ template "pushProxy.client.serviceAccountTokenName" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - annotations: - kubernetes.io/service-account.name: {{ template "pushProxy.client.name" . }} -{{- end }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: true - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 6 }} -{{- end }} - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - - 'emptyDir' - - 'hostPath' - allowedHostPaths: - - pathPrefix: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - readOnly: true -{{- end }} -{{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-clients.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-clients.yaml deleted file mode 100644 index e8fcfb3883..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-clients.yaml +++ /dev/null @@ -1,157 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: apps/v1 -{{- if .Values.clients.deployment.enabled }} -kind: Deployment -{{- else }} -kind: DaemonSet -{{- end }} -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - pushprox-exporter: "client" -spec: - {{- if .Values.clients.deployment.enabled }} - replicas: {{ .Values.clients.deployment.replicas }} - {{- end }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.client.labels" . | nindent 8 }} - spec: - {{- if .Values.clients.affinity }} - affinity: {{ toYaml .Values.clients.affinity | nindent 8 }} - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.clients.nodeSelector }} -{{ toYaml .Values.clients.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.clients.tolerations }} -{{ toYaml .Values.clients.tolerations | indent 8 }} -{{- end }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - serviceAccountName: {{ template "pushProxy.client.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-client - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - {{- range .Values.clients.command }} - - {{ . | quote }} - {{- end }} - args: - - --fqdn=$(HOST_IP) - - --proxy-url=$(PROXY_URL) - {{- if .Values.clients.metrics.enabled }} - - --metrics-addr=$(PORT) - {{- end }} - - --allow-port={{ required "Need .Values.metricsPort to configure client to be allowed to scrape metrics at port" .Values.metricsPort}} - {{- if .Values.clients.useLocalhost }} - - --use-localhost - {{- end }} - {{- if .Values.clients.https.enabled }} - {{- if .Values.clients.https.insecureSkipVerify }} - - --insecure-skip-verify - {{- end }} - {{- if .Values.clients.https.useServiceAccountCredentials }} - - --token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- end }} - {{- if .Values.clients.https.certDir }} - - --tls.cert=/etc/ssl/push-proxy/push-proxy.pem - - --tls.key=/etc/ssl/push-proxy/push-proxy-key.pem - - --tls.cacert=/etc/ssl/push-proxy/push-proxy-ca-cert.pem - {{- end }} - {{- end }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if .Values.clients.metrics.enabled }} - - name: PORT - value: :{{ .Values.clients.port }} - {{- end }} - - name: PROXY_URL - value: {{ template "pushProxy.proxyUrl" . }} - securityContext: - runAsNonRoot: true - runAsUser: 1000 - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - volumeMounts: - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - {{- end }} - {{- if .Values.clients.resources }} - resources: {{ toYaml .Values.clients.resources | nindent 10 }} - {{- end }} - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - initContainers: - - name: copy-certs - image: {{ template "system_default_registry" . }}{{ .Values.clients.copyCertsImage.repository }}:{{ .Values.clients.copyCertsImage.tag }} - command: - - sh - - -c - - | - echo "Searching for files to copy within the source volume" - echo "cert: ${CERT_FILE_NAME}" - echo "key: ${KEY_FILE_NAME}" - echo "cacert: ${CACERT_FILE_NAME}" - - CERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CERT_FILE_NAME}" | sort -r | head -n 1) - KEY_FILE_SOURCE=$(find /etc/source/ -type f -name "${KEY_FILE_NAME}" | sort -r | head -n 1) - CACERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CACERT_FILE_NAME}" | sort -r | head -n 1) - - test -z ${CERT_FILE_SOURCE} && echo "Failed to find cert file" && exit 1 - test -z ${KEY_FILE_SOURCE} && echo "Failed to find key file" && exit 1 - test -z ${CACERT_FILE_SOURCE} && echo "Failed to find cacert file" && exit 1 - - echo "Copying cert file from $CERT_FILE_SOURCE to $CERT_FILE_TARGET" - cp $CERT_FILE_SOURCE $CERT_FILE_TARGET || exit 1 - chmod 444 $CERT_FILE_TARGET || exit 1 - - echo "Copying key file from $KEY_FILE_SOURCE to $KEY_FILE_TARGET" - cp $KEY_FILE_SOURCE $KEY_FILE_TARGET || exit 1 - chmod 444 $KEY_FILE_TARGET || exit 1 - - echo "Copying cacert file from $CACERT_FILE_SOURCE to $CACERT_FILE_TARGET" - cp $CACERT_FILE_SOURCE $CACERT_FILE_TARGET || exit 1 - chmod 444 $CACERT_FILE_TARGET || exit 1 - env: - - name: CERT_FILE_NAME - value: {{ required "Need a TLS cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.certFile }} - - name: KEY_FILE_NAME - value: {{ required "Need a TLS key file for scraping metrics endpoint over HTTPs" .Values.clients.https.keyFile }} - - name: CACERT_FILE_NAME - value: {{ required "Need a TLS CA cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.caCertFile }} - - name: CERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy.pem - - name: KEY_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-key.pem - - name: CACERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-ca-cert.pem - securityContext: - runAsNonRoot: false -{{- if and .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 12 }} -{{- end }} - volumeMounts: - - name: metrics-cert-dir-source - mountPath: /etc/source - readOnly: true - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - volumes: - - name: metrics-cert-dir-source - hostPath: - path: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - - name: metrics-cert-dir - emptyDir: {} - {{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-proxy-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-proxy-rbac.yaml deleted file mode 100644 index eefe609058..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-proxy-rbac.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.proxy.name" . }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.proxy.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- end }}{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-proxy.yaml deleted file mode 100644 index 723bbd6c00..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-proxy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} - pushprox-exporter: "proxy" -spec: - selector: - matchLabels: {{ include "pushProxy.proxy.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.proxy.labels" . | nindent 8 }} - spec: - securityContext: - runAsNonRoot: true - runAsUser: 1000 - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.proxy.nodeSelector }} -{{ toYaml .Values.proxy.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.proxy.tolerations }} -{{ toYaml .Values.proxy.tolerations | indent 8 }} -{{- end }} - serviceAccountName: {{ template "pushProxy.proxy.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-proxy - image: {{ template "system_default_registry" . }}{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag }} - command: - {{- range .Values.proxy.command }} - - {{ . | quote }} - {{- end }} - {{- if .Values.proxy.resources }} - resources: {{ toYaml .Values.proxy.resources | nindent 10 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - ports: - - name: pp-proxy - port: {{ required "Need .Values.proxy.port to configure proxy" .Values.proxy.port }} - protocol: TCP - targetPort: {{ .Values.proxy.port }} - selector: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-servicemonitor.yaml deleted file mode 100644 index 67eb2216b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/pushprox-servicemonitor.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.serviceMonitor }}{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "pushprox.serviceMonitor.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.serviceMonitor.labels" . | nindent 4 }} -spec: - endpoints: {{include "pushProxy.serviceMonitor.endpoints" . | nindent 4 }} - jobLabel: component - podTargetLabels: - - component - - pushprox-exporter - namespaceSelector: - matchNames: - - {{ template "pushprox.namespace" . }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} ---- -{{- $selector := "" }} -{{- if not (kindIs "invalid" .Values.service) }} -{{- if not (kindIs "invalid" .Values.service.selector) }} -{{ if .Values.service.selector }} -{{- if .Values.clients.enabled }} -{{- required (printf "Cannot override .Values.service.selector=%s when .Values.clients.enabled=true" (toJson .Values.service.selector)) "" }} -{{- end }} -{{- $selector = (toYaml .Values.service.selector) }} -{{- end }} -{{- end }} -{{- end }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - ports: - - name: metrics - port: {{ required "Need .Values.metricsPort to configure client to listen to metrics at port" .Values.metricsPort}} - protocol: TCP - targetPort: {{ .Values.metricsPort }} - selector: {{ default (include "pushProxy.client.labels" .) $selector | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/validate-install-crd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/validate-install-crd.yaml deleted file mode 100644 index 16abc2fa83..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/validate-install-crd.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -# {{- $found := dict -}} -# {{- set $found "monitoring.coreos.com/v1/ServiceMonitor" false -}} -# {{- range .Capabilities.APIVersions -}} -# {{- if hasKey $found (toString .) -}} -# {{- set $found (toString .) true -}} -# {{- end -}} -# {{- end -}} -# {{- range $_, $exists := $found -}} -# {{- if (eq $exists false) -}} -# {{- required "Required CRDs are missing. Please install Prometheus Operator CRDs before installing this chart." "" -}} -# {{- end -}} -# {{- end -}} -#{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/validate-psp-install.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/values.yaml deleted file mode 100644 index 1e076041b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/kubeAdmScheduler/values.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# Default values for rancher-pushprox. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Default image containing both the proxy and the client was generated from the following Dockerfile -# https://github.com/prometheus-community/PushProx/blob/eeadbe766641699129920ccfaaaa30a85c67fe81/Dockerfile#L1-L15 - -# Configuration - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - seLinux: - enabled: false - -# A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. -# -# For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches -# any of the semver constraints provided as keys on the map. -# -# On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. -# -# If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. -# -# Notes: -# - On running a helm template, Helm generally assumes the kubeVersion is v1.20.0 -# - On running a helm install --dry-run, the correct kubeVersion should be chosen. -kubeVersionOverrides: [] -# - constraint: "< 1.21" -# values: -# metricsPort: 10252 -# clients: -# https: -# enabled: false -# insecureSkipVerify: false -# useServiceAccountCredentials: false - -namespaceOverride: "" - -# The component that is being monitored (i.e. etcd) -component: "component" - -# The port containing the metrics that need to be scraped -metricsPort: 2739 - -# Configure ServiceMonitor that monitors metrics from the metricsPort endpoint -serviceMonitor: - enabled: true - # A list of endpoints that will be added to the ServiceMonitor based on the Endpoint spec - # Source: https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint - # By default, proxyUrl and params._scheme will be overridden based on other values - endpoints: - - port: metrics - -# Configure Service that grabs scrape targets -service: - # The selector that is used to populate the Service's Endpoints object. - # The chart will error out on rendering templating if .Values.clients.enabled is set alongside this field, - # since it is expected that this service should point to the PushProx Clients Daemonset / Deployment - selector: {} - -clients: - enabled: true - # The port which the PushProx client will post PushProx metrics to - port: 9369 - # If unset, this will default to the URL for the proxy service: http://pushprox-{{component}}-proxy.{{namepsace}}.svc.cluster.local:{{proxy.port}} - # Should be modified if the clients are being deployed outside the cluster where the proxy rests, otherwise leave it null - proxyUrl: "" - # If set to true, the client will forward any requests from the host IP to 127.0.0.1 - # It will only allow proxy requests to the metricsPort specified - useLocalhost: false - # Configuration for accessing metrics via HTTPS - https: - # Does the client require https to access the metrics? - enabled: false - # Does the client require requests be sent to http or https? - forceHTTPSScheme: false - # If set to true, the client will create a service account with adequate permissions and set a flag - # on the client to use the service account token provided by it to make authorized scrape requests - useServiceAccountCredentials: false - # Configuration for authentication to metrics via https endpoint - authenticationMethod: - # Reads token from defined file in container - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenFile: - enabled: false - bearerTokenFilePath: "/var/run/secrets/kubernetes.io/serviceaccount/token" - # Reads token from defined secret in namespace - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenSecret: - enabled: false - # Reads token from defined secret in namespace - authorization: - enabled: false - type: "bearer" - credentials: - key: "token" - optional: false - # If set to true, the client will disable SSL security checks - insecureSkipVerify: false - # Directory on host where necessary TLS cert and key to scrape metrics can be found - certDir: "" - # Filenames for files located in .Values.clients.https.certDir that correspond to TLS settings - certFile: "" - keyFile: "" - caCertFile: "" - # seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. - # Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. - seLinuxOptions: {} - - metrics: - # Whether the client should publish PushProx client-specific metrics to .Values.clients.port - enabled: false - - rbac: - # Additional permissions to provide to the ServiceAccount bound to the client - # This can be used to provide additional permissions for the client to scrape metrics from the k8s API - # Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true - additionalRules: [] - - # Resource limits - resources: {} - - # Options to select all nodes to deploy client DaemonSet on - nodeSelector: {} - tolerations: [] - affinity: {} - - image: - repository: rancher/pushprox-client - tag: v0.1.3-rancher2-client - command: ["pushprox-client"] - - copyCertsImage: - repository: rancher/mirrored-library-busybox - tag: 1.31.1 - - # The default intention of rancher-pushprox clients is to scrape hostNetwork metrics across all nodes. - # This can be used to scrape internal Kubernetes components or DaemonSets of hostNetwork Pods in - # situations where a cloud provider firewall prevents Pod-To-Host communication but not Pod-To-Pod. - # However, if the underlying hostNetwork Pod that is being scraped is managed by a Deployment, - # this advanced option enables users to deploy the client as a Deployment instead of a DaemonSet. - # If a user deploys this feature and the underlying Deployment's number of replicas changes, the user will - # be responsible for upgrading this chart accordingly to the right number of replicas. - deployment: - enabled: false - replicas: 0 - -proxy: - enabled: true - # The port through which PushProx clients will communicate to the proxy - port: 8080 - - # Resource limits - resources: {} - - # Options to select a node to run a single proxy deployment on - nodeSelector: {} - tolerations: [] - - image: - repository: rancher/pushprox-proxy - tag: v0.1.3-rancher2-proxy - command: ["pushprox-proxy"] diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/.helmignore deleted file mode 100644 index f0c1319444..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/.helmignore +++ /dev/null @@ -1,21 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/Chart.yaml deleted file mode 100644 index 074ad9c1fa..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/Chart.yaml +++ /dev/null @@ -1,27 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.16.0-0 < 1.27.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-prometheus-adapter -apiVersion: v1 -appVersion: v0.10.0 -description: A Helm chart for k8s prometheus adapter -home: https://github.com/kubernetes-sigs/prometheus-adapter -keywords: -- hpa -- metrics -- prometheus -- adapter -maintainers: -- email: mattias.gees@jetstack.io - name: mattiasgees -- name: steven-sheehy -- email: hfernandez@mesosphere.com - name: hectorj2f -name: prometheus-adapter -sources: -- https://github.com/kubernetes/charts -- https://github.com/kubernetes-sigs/prometheus-adapter -version: 4.2.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/README.md deleted file mode 100644 index d77bb0c920..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/README.md +++ /dev/null @@ -1,160 +0,0 @@ -# Prometheus Adapter - -Installs the [Prometheus Adapter](https://github.com/kubernetes-sigs/prometheus-adapter) for the Custom Metrics API. Custom metrics are used in Kubernetes by [Horizontal Pod Autoscalers](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/) to scale workloads based upon your own metric pulled from an external metrics provider like Prometheus. This chart complements the [metrics-server](https://github.com/helm/charts/tree/master/stable/metrics-server) chart that provides resource only metrics. - -## Prerequisites - -Kubernetes 1.14+ - -## Get Helm Repositories Info - -```console -helm repo add prometheus-community https://prometheus-community.github.io/helm-charts -helm repo update -``` - -_See [`helm repo`](https://helm.sh/docs/helm/helm_repo/) for command documentation._ - -## Install Helm Chart - -```console -helm install [RELEASE_NAME] prometheus-community/prometheus-adapter -``` - -_See [configuration](#configuration) below._ - -_See [helm install](https://helm.sh/docs/helm/helm_install/) for command documentation._ - -## Uninstall Helm Chart - -```console -helm uninstall [RELEASE_NAME] -``` - -This removes all the Kubernetes components associated with the chart and deletes the release. - -_See [helm uninstall](https://helm.sh/docs/helm/helm_uninstall/) for command documentation._ - -## Upgrading Helm Chart - -```console -helm upgrade [RELEASE_NAME] [CHART] --install -``` - -_See [helm upgrade](https://helm.sh/docs/helm/helm_upgrade/) for command documentation._ - -### To 4.2.0 - -Readiness and liveness probes are now fully configurable through values `readinessProbe` and `livenessProbe`. The previous values have been kept as defaults. - -### To 4.0.0 - -Previously, security context of the container was set directly in the deployment template. This release makes it configurable through the new configuration variable `securityContext` whilst keeping the previously set values as defaults. Furthermore, previous variable `runAsUser` is now set in `securityContext` and is not used any longer. Please, use `securityContext.runAsUser` instead. In the same security context, `seccompProfile` has been enabled and set to type `RuntimeDefault`. - -### To 3.0.0 - -Due to a change in deployment labels, the upgrade requires `helm upgrade --force` in order to re-create the deployment. - -## Configuration - -See [Customizing the Chart Before Installing](https://helm.sh/docs/intro/using_helm/#customizing-the-chart-before-installing). To see all configurable options with detailed comments, visit the chart's [values.yaml](./values.yaml), or run these configuration commands: - -```console -helm show values prometheus-community/prometheus-adapter -``` - -### Prometheus Service Endpoint - -To use the chart, ensure the `prometheus.url` and `prometheus.port` are configured with the correct Prometheus service endpoint. If Prometheus is exposed under HTTPS the host's CA Bundle must be exposed to the container using `extraVolumes` and `extraVolumeMounts`. - -### Adapter Rules - -Additionally, the chart comes with a set of default rules out of the box but they may pull in too many metrics or not map them correctly for your needs. Therefore, it is recommended to populate `rules.custom` with a list of rules (see the [config document](https://github.com/kubernetes-sigs/prometheus-adapter/blob/master/docs/config.md) for the proper format). - -### Horizontal Pod Autoscaler Metrics - -Finally, to configure your Horizontal Pod Autoscaler to use the custom metric, see the custom metrics section of the [HPA walkthrough](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/#autoscaling-on-multiple-metrics-and-custom-metrics). - -The Prometheus Adapter can serve three different [metrics APIs](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/#support-for-metrics-apis): - -### Custom Metrics - -Enabling this option will cause custom metrics to be served at `/apis/custom.metrics.k8s.io/v1beta1`. Enabled by default when `rules.default` is true, but can be customized by populating `rules.custom`: - -```yaml -rules: - custom: - - seriesQuery: '{__name__=~"^some_metric_count$"}' - resources: - template: <<.Resource>> - name: - matches: "" - as: "my_custom_metric" - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>) -``` - -### External Metrics - -Enabling this option will cause external metrics to be served at `/apis/external.metrics.k8s.io/v1beta1`. Can be enabled by populating `rules.external`: - -```yaml -rules: - external: - - seriesQuery: '{__name__=~"^some_metric_count$"}' - resources: - template: <<.Resource>> - name: - matches: "" - as: "my_external_metric" - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>) -``` - -### Resource Metrics - -Enabling this option will cause resource metrics to be served at `/apis/metrics.k8s.io/v1beta1`. Resource metrics will allow pod CPU and Memory metrics to be used in [Horizontal Pod Autoscalers](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/) as well as the `kubectl top` command. Can be enabled by populating `rules.resource`: - -```yaml -rules: - resource: - cpu: - containerQuery: | - sum by (<<.GroupBy>>) ( - rate(container_cpu_usage_seconds_total{container!="",<<.LabelMatchers>>}[3m]) - ) - nodeQuery: | - sum by (<<.GroupBy>>) ( - rate(node_cpu_seconds_total{mode!="idle",mode!="iowait",mode!="steal",<<.LabelMatchers>>}[3m]) - ) - resources: - overrides: - node: - resource: node - namespace: - resource: namespace - pod: - resource: pod - containerLabel: container - memory: - containerQuery: | - sum by (<<.GroupBy>>) ( - avg_over_time(container_memory_working_set_bytes{container!="",<<.LabelMatchers>>}[3m]) - ) - nodeQuery: | - sum by (<<.GroupBy>>) ( - avg_over_time(node_memory_MemTotal_bytes{<<.LabelMatchers>>}[3m]) - - - avg_over_time(node_memory_MemAvailable_bytes{<<.LabelMatchers>>}[3m]) - ) - resources: - overrides: - node: - resource: node - namespace: - resource: namespace - pod: - resource: pod - containerLabel: container - window: 3m -``` - -**NOTE:** Setting a value for `rules.resource` will also deploy the resource metrics API service, providing the same functionality as [metrics-server](https://github.com/helm/charts/tree/master/stable/metrics-server). As such it is not possible to deploy them both in the same cluster. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/NOTES.txt b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/NOTES.txt deleted file mode 100644 index b7b9b99322..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/NOTES.txt +++ /dev/null @@ -1,9 +0,0 @@ -{{ template "k8s-prometheus-adapter.fullname" . }} has been deployed. -In a few minutes you should be able to list metrics using the following command(s): -{{ if .Values.rules.resource }} - kubectl get --raw /apis/metrics.k8s.io/v1beta1 -{{- end }} - kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1 -{{ if .Values.rules.external }} - kubectl get --raw /apis/external.metrics.k8s.io/v1beta1 -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/_helpers.tpl deleted file mode 100644 index edbb829b2b..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/_helpers.tpl +++ /dev/null @@ -1,113 +0,0 @@ -# Rancher -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "k8s-prometheus-adapter.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 "k8s-prometheus-adapter.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 -}} - -{{/* -Allow the release namespace to be overridden for multi-namespace deployments in combined charts -*/}} -{{- define "k8s-prometheus-adapter.namespace" -}} -{{- default .Release.Namespace .Values.namespaceOverride -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "k8s-prometheus-adapter.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Generate basic labels -*/}} -{{- define "k8s-prometheus-adapter.labels" }} -helm.sh/chart: {{ include "k8s-prometheus-adapter.chart" . }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -app.kubernetes.io/component: metrics -app.kubernetes.io/part-of: {{ template "k8s-prometheus-adapter.name" . }} -{{- include "k8s-prometheus-adapter.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -{{- if .Values.customLabels }} -{{ toYaml .Values.customLabels }} -{{- end }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "k8s-prometheus-adapter.selectorLabels" }} -app.kubernetes.io/name: {{ include "k8s-prometheus-adapter.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define "k8s-prometheus-adapter.serviceAccountName" -}} -{{- if .Values.serviceAccount.create -}} - {{ default (include "k8s-prometheus-adapter.fullname" .) .Values.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* Get Policy API Version */}} -{{- define "k8s-prometheus-adapter.pdb.apiVersion" -}} -{{- if and (.Capabilities.APIVersions.Has "policy/v1") (semverCompare ">= 1.21-0" .Capabilities.KubeVersion.Version) -}} - {{- print "policy/v1" -}} -{{- else -}} - {{- print "policy/v1beta1" -}} -{{- end -}} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/certmanager.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/certmanager.yaml deleted file mode 100644 index 4e32c964c6..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/certmanager.yaml +++ /dev/null @@ -1,76 +0,0 @@ -{{- if .Values.certManager.enabled -}} ---- -# Create a selfsigned Issuer, in order to create a root CA certificate for -# signing webhook serving certificates -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - name: {{ template "k8s-prometheus-adapter.fullname" . }}-self-signed-issuer - namespace: {{ include "k8s-prometheus-adapter.namespace" . }} - {{- if .Values.customAnnotations }} - annotations: - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} -spec: - selfSigned: {} ---- -# Generate a CA Certificate used to sign certificates for the webhook -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: {{ template "k8s-prometheus-adapter.fullname" . }}-root-cert - namespace: {{ include "k8s-prometheus-adapter.namespace" . }} - {{- if .Values.customAnnotations }} - annotations: - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} -spec: - secretName: {{ template "k8s-prometheus-adapter.fullname" . }}-root-cert - duration: {{ .Values.certManager.caCertDuration }} - issuerRef: - name: {{ template "k8s-prometheus-adapter.fullname" . }}-self-signed-issuer - commonName: "ca.webhook.prometheus-adapter" - isCA: true ---- -# Create an Issuer that uses the above generated CA certificate to issue certs -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - name: {{ template "k8s-prometheus-adapter.fullname" . }}-root-issuer - namespace: {{ include "k8s-prometheus-adapter.namespace" . }} - {{- if .Values.customAnnotations }} - annotations: - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} -spec: - ca: - secretName: {{ template "k8s-prometheus-adapter.fullname" . }}-root-cert ---- -# Finally, generate a serving certificate for the apiservices to use -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: {{ template "k8s-prometheus-adapter.fullname" . }}-cert - namespace: {{ include "k8s-prometheus-adapter.namespace" . }} - {{- if .Values.customAnnotations }} - annotations: - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} -spec: - secretName: {{ template "k8s-prometheus-adapter.fullname" . }} - duration: {{ .Values.certManager.certDuration }} - issuerRef: - name: {{ template "k8s-prometheus-adapter.fullname" . }}-root-issuer - dnsNames: - - {{ template "k8s-prometheus-adapter.fullname" . }} - - {{ template "k8s-prometheus-adapter.fullname" . }}.{{ include "k8s-prometheus-adapter.namespace" . }} - - {{ template "k8s-prometheus-adapter.fullname" . }}.{{ include "k8s-prometheus-adapter.namespace" . }}.svc -{{- end -}} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/cluster-role-binding-auth-delegator.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/cluster-role-binding-auth-delegator.yaml deleted file mode 100644 index 6701e6ba08..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/cluster-role-binding-auth-delegator.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - {{- if .Values.customAnnotations }} - annotations: - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: {{ template "k8s-prometheus-adapter.name" . }}-system-auth-delegator -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: system:auth-delegator -subjects: -- kind: ServiceAccount - name: {{ template "k8s-prometheus-adapter.serviceAccountName" . }} - namespace: {{ include "k8s-prometheus-adapter.namespace" . | quote }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/cluster-role-binding-resource-reader.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/cluster-role-binding-resource-reader.yaml deleted file mode 100644 index 67efd2aa2f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/cluster-role-binding-resource-reader.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - {{- if .Values.customAnnotations }} - annotations: - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: {{ template "k8s-prometheus-adapter.name" . }}-resource-reader -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "k8s-prometheus-adapter.name" . }}-resource-reader -subjects: -- kind: ServiceAccount - name: {{ template "k8s-prometheus-adapter.serviceAccountName" . }} - namespace: {{ include "k8s-prometheus-adapter.namespace" . | quote }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/cluster-role-resource-reader.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/cluster-role-resource-reader.yaml deleted file mode 100644 index 2c690a03cc..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/cluster-role-resource-reader.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- if .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - {{- if .Values.customAnnotations }} - annotations: - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: {{ template "k8s-prometheus-adapter.name" . }}-resource-reader -rules: -- apiGroups: - - "" - resources: - - namespaces - - pods - - services - - configmaps - verbs: - - get - - list - - watch -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/configmap.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/configmap.yaml deleted file mode 100644 index 17f415d970..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/configmap.yaml +++ /dev/null @@ -1,97 +0,0 @@ -{{- if not .Values.rules.existing -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "k8s-prometheus-adapter.fullname" . }} - namespace: {{ include "k8s-prometheus-adapter.namespace" . }} - {{- if .Values.customAnnotations }} - annotations: - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} -data: - config.yaml: | -{{- if or .Values.rules.default .Values.rules.custom }} - rules: -{{- if .Values.rules.default }} - - seriesQuery: '{__name__=~"^container_.*",container!="POD",namespace!="",pod!=""}' - seriesFilters: [] - resources: - overrides: - namespace: - resource: namespace - pod: - resource: pod - name: - matches: ^container_(.*)_seconds_total$ - as: "" - metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>,container!="POD"}[5m])) - by (<<.GroupBy>>) - - seriesQuery: '{__name__=~"^container_.*",container!="POD",namespace!="",pod!=""}' - seriesFilters: - - isNot: ^container_.*_seconds_total$ - resources: - overrides: - namespace: - resource: namespace - pod: - resource: pod - name: - matches: ^container_(.*)_total$ - as: "" - metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>,container!="POD"}[5m])) - by (<<.GroupBy>>) - - seriesQuery: '{__name__=~"^container_.*",container!="POD",namespace!="",pod!=""}' - seriesFilters: - - isNot: ^container_.*_total$ - resources: - overrides: - namespace: - resource: namespace - pod: - resource: pod - name: - matches: ^container_(.*)$ - as: "" - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>,container!="POD"}) by (<<.GroupBy>>) - - seriesQuery: '{namespace!="",__name__!~"^container_.*"}' - seriesFilters: - - isNot: .*_total$ - resources: - template: <<.Resource>> - name: - matches: "" - as: "" - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>) - - seriesQuery: '{namespace!="",__name__!~"^container_.*"}' - seriesFilters: - - isNot: .*_seconds_total - resources: - template: <<.Resource>> - name: - matches: ^(.*)_total$ - as: "" - metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[5m])) by (<<.GroupBy>>) - - seriesQuery: '{namespace!="",__name__!~"^container_.*"}' - seriesFilters: [] - resources: - template: <<.Resource>> - name: - matches: ^(.*)_seconds_total$ - as: "" - metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[5m])) by (<<.GroupBy>>) -{{- end -}} -{{- if .Values.rules.custom }} -{{ toYaml .Values.rules.custom | indent 4 }} -{{- end -}} -{{- end -}} -{{- if .Values.rules.external }} - externalRules: -{{ toYaml .Values.rules.external | indent 4 }} -{{- end -}} -{{- if .Values.rules.resource }} - resourceRules: -{{ toYaml .Values.rules.resource | indent 6 }} -{{- end -}} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/custom-metrics-apiservice.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/custom-metrics-apiservice.yaml deleted file mode 100644 index 8b7b4e555e..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/custom-metrics-apiservice.yaml +++ /dev/null @@ -1,34 +0,0 @@ -{{- if or .Values.rules.default .Values.rules.custom }} -{{- if .Capabilities.APIVersions.Has "apiregistration.k8s.io/v1" }} -apiVersion: apiregistration.k8s.io/v1 -{{- else }} -apiVersion: apiregistration.k8s.io/v1beta1 -{{- end }} -kind: APIService -metadata: -{{- if or .Values.certManager.enabled .Values.customAnnotations }} - annotations: - certmanager.k8s.io/inject-ca-from: {{ printf "%s/%s-root-cert" (include "k8s-prometheus-adapter.namespace" .) (include "k8s-prometheus-adapter.fullname" .) | quote }} - cert-manager.io/inject-ca-from: {{ printf "%s/%s-root-cert" (include "k8s-prometheus-adapter.namespace" .) (include "k8s-prometheus-adapter.fullname" .) | quote }} - {{- if .Values.customAnnotations }} - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} -{{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: v1beta1.custom.metrics.k8s.io -spec: - service: - name: {{ template "k8s-prometheus-adapter.fullname" . }} - namespace: {{ include "k8s-prometheus-adapter.namespace" . | quote }} - {{- if .Values.tls.enable }} - caBundle: {{ b64enc .Values.tls.ca }} - {{- end }} - group: custom.metrics.k8s.io - version: v1beta1 - {{- if not (or .Values.tls.enable .Values.certManager.enabled) }} - insecureSkipTLSVerify: true - {{- end }} - groupPriorityMinimum: 100 - versionPriority: 100 -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/custom-metrics-cluster-role-binding-hpa.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/custom-metrics-cluster-role-binding-hpa.yaml deleted file mode 100644 index 0cc6920836..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/custom-metrics-cluster-role-binding-hpa.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- /* -This if must be aligned with custom-metrics-cluster-role.yaml -as otherwise this binding will point to not existing role. -*/ -}} -{{- if and .Values.rbac.create (or .Values.rules.default .Values.rules.custom) -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - {{- if .Values.customAnnotations }} - annotations: - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: {{ template "k8s-prometheus-adapter.name" . }}-hpa-controller -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "k8s-prometheus-adapter.name" . }}-server-resources -subjects: -- kind: ServiceAccount - name: {{ template "k8s-prometheus-adapter.serviceAccountName" . }} - namespace: {{ include "k8s-prometheus-adapter.namespace" . | quote }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/custom-metrics-cluster-role.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/custom-metrics-cluster-role.yaml deleted file mode 100644 index 4aa15ffe99..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/custom-metrics-cluster-role.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if and .Values.rbac.create (or .Values.rules.default .Values.rules.custom) -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - {{- if .Values.customAnnotations }} - annotations: - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: {{ template "k8s-prometheus-adapter.name" . }}-server-resources -rules: -- apiGroups: - - custom.metrics.k8s.io - resources: ["*"] - verbs: ["*"] -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/deployment.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/deployment.yaml deleted file mode 100644 index f96c21ccac..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/deployment.yaml +++ /dev/null @@ -1,144 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - {{- if or .Values.customAnnotations .Values.deploymentAnnotations }} - annotations: - {{- with .Values.customAnnotations }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.deploymentAnnotations }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: {{ template "k8s-prometheus-adapter.fullname" . }} - namespace: {{ include "k8s-prometheus-adapter.namespace" . }} -spec: - replicas: {{ .Values.replicas }} - strategy: {{ toYaml .Values.strategy | nindent 4 }} - selector: - matchLabels: - {{- include "k8s-prometheus-adapter.selectorLabels" . | indent 6 }} - template: - metadata: - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 8 }} - {{- with .Values.podLabels }} - {{- toYaml . | trim | nindent 8 }} - {{- end }} - name: {{ template "k8s-prometheus-adapter.name" . }} - annotations: - checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} - {{- with .Values.podAnnotations }} - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.customAnnotations }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - serviceAccountName: {{ template "k8s-prometheus-adapter.serviceAccountName" . }} - {{- if .Values.hostNetwork.enabled }} - hostNetwork: true - {{- end }} - {{- if .Values.dnsPolicy }} - dnsPolicy: {{ .Values.dnsPolicy }} - {{- end}} - containers: - - name: {{ .Chart.Name }} - image: "{{ template "system_default_registry" . }}{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - {{- with .Values.env }} - env: - {{- toYaml . | nindent 8 }} - {{- end }} - args: - - /adapter - - --secure-port={{ .Values.listenPort }} - {{- if or .Values.tls.enable .Values.certManager.enabled }} - - --tls-cert-file=/var/run/serving-cert/tls.crt - - --tls-private-key-file=/var/run/serving-cert/tls.key - {{- end }} - - --cert-dir=/tmp/cert - - --logtostderr=true - - --prometheus-url={{ tpl .Values.prometheus.url . }}{{ if .Values.prometheus.port }}:{{ .Values.prometheus.port }}{{end}}{{ .Values.prometheus.path }} - - --metrics-relist-interval={{ .Values.metricsRelistInterval }} - - --v={{ .Values.logLevel }} - - --config=/etc/adapter/config.yaml - {{- if .Values.extraArguments }} - {{- toYaml .Values.extraArguments | trim | nindent 8 }} - {{- end }} - ports: - - containerPort: {{ .Values.listenPort }} - name: https - {{- with .Values.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 10 }} - {{- end }} - {{- with .Values.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 10 }} - {{- end }} - {{- if .Values.resources }} - resources: - {{- toYaml .Values.resources | nindent 10 }} - {{- end }} - {{- with .Values.dnsConfig }} - dnsConfig: - {{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.securityContext }} - securityContext: - {{- toYaml . | nindent 10 }} - {{- end }} - volumeMounts: - {{- if .Values.extraVolumeMounts }} - {{ toYaml .Values.extraVolumeMounts | trim | nindent 8 }} - {{ end }} - - mountPath: /etc/adapter/ - name: config - readOnly: true - - mountPath: /tmp - name: tmp - {{- if or .Values.tls.enable .Values.certManager.enabled }} - - mountPath: /var/run/serving-cert - name: volume-serving-cert - readOnly: true - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.nodeSelector }} -{{- toYaml .Values.nodeSelector | nindent 8 }} -{{- end }} - affinity: - {{- toYaml .Values.affinity | nindent 8 }} - topologySpreadConstraints: - {{- toYaml .Values.topologySpreadConstraints | nindent 8 }} - priorityClassName: {{ .Values.priorityClassName }} - {{- if .Values.podSecurityContext }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - {{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.tolerations }} -{{- toYaml .Values.tolerations | nindent 8 }} -{{- end }} - {{- if .Values.image.pullSecrets }} - imagePullSecrets: - {{- range .Values.image.pullSecrets }} - - name: {{ . }} - {{- end }} - {{- end }} - volumes: - {{- if .Values.extraVolumes }} - {{ toYaml .Values.extraVolumes | trim | nindent 6 }} - {{ end }} - - name: config - configMap: - name: {{ .Values.rules.existing | default (include "k8s-prometheus-adapter.fullname" . ) }} - - name: tmp - emptyDir: {} - {{- if or .Values.tls.enable .Values.certManager.enabled }} - - name: volume-serving-cert - secret: - secretName: {{ template "k8s-prometheus-adapter.fullname" . }} - {{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/external-metrics-apiservice.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/external-metrics-apiservice.yaml deleted file mode 100644 index 21339af128..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/external-metrics-apiservice.yaml +++ /dev/null @@ -1,34 +0,0 @@ -{{- if .Values.rules.external }} -{{- if .Capabilities.APIVersions.Has "apiregistration.k8s.io/v1" }} -apiVersion: apiregistration.k8s.io/v1 -{{- else }} -apiVersion: apiregistration.k8s.io/v1beta1 -{{- end }} -kind: APIService -metadata: -{{- if or .Values.certManager.enabled .Values.customAnnotations }} - annotations: - certmanager.k8s.io/inject-ca-from: {{ printf "%s/%s-root-cert" (include "k8s-prometheus-adapter.namespace" .) (include "k8s-prometheus-adapter.fullname" .) | quote }} - cert-manager.io/inject-ca-from: {{ printf "%s/%s-root-cert" (include "k8s-prometheus-adapter.namespace" .) (include "k8s-prometheus-adapter.fullname" .) | quote }} - {{- if .Values.customAnnotations }} - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} -{{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: v1beta1.external.metrics.k8s.io -spec: - service: - name: {{ template "k8s-prometheus-adapter.fullname" . }} - namespace: {{ include "k8s-prometheus-adapter.namespace" . | quote }} - {{- if .Values.tls.enable }} - caBundle: {{ b64enc .Values.tls.ca }} - {{- end }} - group: external.metrics.k8s.io - version: v1beta1 - {{- if not (or .Values.tls.enable .Values.certManager.enabled) }} - insecureSkipTLSVerify: true - {{- end }} - groupPriorityMinimum: 100 - versionPriority: 100 -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/external-metrics-cluster-role-binding-hpa.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/external-metrics-cluster-role-binding-hpa.yaml deleted file mode 100644 index 05547bd323..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/external-metrics-cluster-role-binding-hpa.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if and .Values.rbac.create .Values.rules.external -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - {{- if .Values.customAnnotations }} - annotations: - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: {{ template "k8s-prometheus-adapter.name" . }}-hpa-controller-external-metrics -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "k8s-prometheus-adapter.name" . }}-external-metrics -subjects: -- kind: ServiceAccount - name: horizontal-pod-autoscaler - namespace: kube-system -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/external-metrics-cluster-role.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/external-metrics-cluster-role.yaml deleted file mode 100644 index 212ea78b25..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/external-metrics-cluster-role.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if and .Values.rbac.create .Values.rules.external -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - {{- if .Values.customAnnotations }} - annotations: - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: {{ template "k8s-prometheus-adapter.name" . }}-external-metrics -rules: -- apiGroups: - - "external.metrics.k8s.io" - resources: - - "*" - verbs: - - list - - get - - watch -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/pdb.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/pdb.yaml deleted file mode 100644 index 205761a9f1..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/pdb.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if .Values.podDisruptionBudget.enabled }} -apiVersion: {{ include "k8s-prometheus-adapter.pdb.apiVersion" . }} -kind: PodDisruptionBudget -metadata: - name: {{ template "k8s-prometheus-adapter.fullname" . }} - namespace: {{ include "k8s-prometheus-adapter.namespace" . }} - {{- if .Values.customAnnotations }} - annotations: - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} -spec: - {{- if .Values.podDisruptionBudget.minAvailable }} - minAvailable: {{ .Values.podDisruptionBudget.minAvailable }} - {{- end }} - {{- if .Values.podDisruptionBudget.maxUnavailable }} - maxUnavailable: {{ .Values.podDisruptionBudget.maxUnavailable }} - {{- end }} - selector: - matchLabels: - {{- include "k8s-prometheus-adapter.selectorLabels" . | indent 6 }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/psp.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/psp.yaml deleted file mode 100644 index fded5a7491..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/psp.yaml +++ /dev/null @@ -1,66 +0,0 @@ -{{- if and (or .Values.global.cattle.psp.enabled .Values.psp.create) (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} ---- -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "k8s-prometheus-adapter.fullname" . }} - {{- if .Values.customAnnotations }} - annotations: - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} -spec: - {{- if .Values.hostNetwork.enabled }} - hostNetwork: true - hostPorts: - - min: {{ .Values.listenPort }} - max: {{ .Values.listenPort }} - {{- end }} - fsGroup: - rule: RunAsAny - runAsGroup: - rule: RunAsAny - runAsUser: - rule: MustRunAs - ranges: - - min: 1024 - max: 65535 - seLinux: - rule: RunAsAny - supplementalGroups: - rule: RunAsAny - volumes: - - secret - - emptyDir - - configMap ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: {{ template "k8s-prometheus-adapter.name" . }}-psp -rules: -- apiGroups: - - 'policy' - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "k8s-prometheus-adapter.fullname" . }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: {{ template "k8s-prometheus-adapter.name" . }}-psp -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "k8s-prometheus-adapter.name" . }}-psp -subjects: -- kind: ServiceAccount - name: {{ template "k8s-prometheus-adapter.serviceAccountName" . }} - namespace: {{ include "k8s-prometheus-adapter.namespace" . | quote }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/resource-metrics-apiservice.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/resource-metrics-apiservice.yaml deleted file mode 100644 index 0cc9fff6a2..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/resource-metrics-apiservice.yaml +++ /dev/null @@ -1,34 +0,0 @@ -{{- if .Values.rules.resource}} -{{- if .Capabilities.APIVersions.Has "apiregistration.k8s.io/v1" }} -apiVersion: apiregistration.k8s.io/v1 -{{- else }} -apiVersion: apiregistration.k8s.io/v1beta1 -{{- end }} -kind: APIService -metadata: -{{- if or .Values.certManager.enabled .Values.customAnnotations }} - annotations: - certmanager.k8s.io/inject-ca-from: {{ printf "%s/%s-root-cert" (include "k8s-prometheus-adapter.namespace" .) (include "k8s-prometheus-adapter.fullname" .) | quote }} - cert-manager.io/inject-ca-from: {{ printf "%s/%s-root-cert" (include "k8s-prometheus-adapter.namespace" .) (include "k8s-prometheus-adapter.fullname" .) | quote }} - {{- if .Values.customAnnotations }} - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} -{{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: v1beta1.metrics.k8s.io -spec: - service: - name: {{ template "k8s-prometheus-adapter.fullname" . }} - namespace: {{ include "k8s-prometheus-adapter.namespace" . | quote }} - {{- if .Values.tls.enable }} - caBundle: {{ b64enc .Values.tls.ca }} - {{- end }} - group: metrics.k8s.io - version: v1beta1 - {{- if not (or .Values.tls.enable .Values.certManager.enabled) }} - insecureSkipTLSVerify: true - {{- end }} - groupPriorityMinimum: 100 - versionPriority: 100 -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/resource-metrics-cluster-role-binding.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/resource-metrics-cluster-role-binding.yaml deleted file mode 100644 index 3c247e48d2..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/resource-metrics-cluster-role-binding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if and .Values.rbac.create .Values.rules.resource -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - {{- if .Values.customAnnotations }} - annotations: - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: {{ template "k8s-prometheus-adapter.name" . }}-hpa-controller-metrics -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "k8s-prometheus-adapter.name" . }}-metrics -subjects: -- kind: ServiceAccount - name: {{ template "k8s-prometheus-adapter.serviceAccountName" . }} - namespace: {{ include "k8s-prometheus-adapter.namespace" . | quote }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/resource-metrics-cluster-role.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/resource-metrics-cluster-role.yaml deleted file mode 100644 index 73d8953046..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/resource-metrics-cluster-role.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if and .Values.rbac.create .Values.rules.resource -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - {{- if .Values.customAnnotations }} - annotations: - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: {{ template "k8s-prometheus-adapter.name" . }}-metrics -rules: -- apiGroups: - - "" - resources: - - pods - - nodes - - nodes/stats - verbs: - - get - - list - - watch -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/role-binding-auth-reader.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/role-binding-auth-reader.yaml deleted file mode 100644 index d3c77c1c65..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/role-binding-auth-reader.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - {{- if .Values.customAnnotations }} - annotations: - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: {{ template "k8s-prometheus-adapter.name" . }}-auth-reader - namespace: kube-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: extension-apiserver-authentication-reader -subjects: -- kind: ServiceAccount - name: {{ template "k8s-prometheus-adapter.serviceAccountName" . }} - namespace: {{ include "k8s-prometheus-adapter.namespace" . | quote }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/secret.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/secret.yaml deleted file mode 100644 index 3e7e8887bd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/secret.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if .Values.tls.enable -}} -apiVersion: v1 -kind: Secret -metadata: - {{- if .Values.customAnnotations }} - annotations: - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: {{ template "k8s-prometheus-adapter.fullname" . }} - namespace: {{ include "k8s-prometheus-adapter.namespace" . }} -type: kubernetes.io/tls -data: - tls.crt: {{ b64enc .Values.tls.certificate }} - tls.key: {{ b64enc .Values.tls.key }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/service.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/service.yaml deleted file mode 100644 index ddac37cfa1..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/service.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - {{- if or .Values.service.annotations .Values.customAnnotations }} - annotations: - {{- if .Values.service.annotations }} - {{ toYaml .Values.service.annotations | indent 4 }} - {{- end }} - {{- if .Values.customAnnotations }} - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} - {{- end }} - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: {{ template "k8s-prometheus-adapter.fullname" . }} - namespace: {{ include "k8s-prometheus-adapter.namespace" . }} -spec: - ports: - - port: {{ .Values.service.port }} - protocol: TCP - targetPort: https - selector: - {{- include "k8s-prometheus-adapter.selectorLabels" . | indent 4 }} - type: {{ .Values.service.type }} - {{- if .Values.service.clusterIP }} - clusterIP: {{ .Values.service.clusterIP }} - {{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/serviceaccount.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/serviceaccount.yaml deleted file mode 100644 index 30a169ae0e..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/templates/serviceaccount.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- if .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - {{- include "k8s-prometheus-adapter.labels" . | indent 4 }} - name: {{ template "k8s-prometheus-adapter.serviceAccountName" . }} - namespace: {{ include "k8s-prometheus-adapter.namespace" . }} -{{- if or .Values.serviceAccount.annotations .Values.customAnnotations }} - annotations: - {{- if .Values.serviceAccount.annotations }} - {{- toYaml .Values.serviceAccount.annotations | nindent 4 }} - {{- end }} - {{- if .Values.customAnnotations }} - {{- toYaml .Values.customAnnotations | nindent 4 }} - {{- end }} -{{- end }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/values.yaml deleted file mode 100644 index 5e7a3d4eed..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-adapter/values.yaml +++ /dev/null @@ -1,277 +0,0 @@ -# Default values for k8s-prometheus-adapter.. -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - -affinity: {} - -topologySpreadConstraints: [] - -image: - repository: rancher/mirrored-prometheus-adapter-prometheus-adapter - tag: v0.10.0 - pullPolicy: IfNotPresent - -logLevel: 4 - -metricsRelistInterval: 1m - -listenPort: 6443 - -nodeSelector: {} - -priorityClassName: "" - -## Override the release namespace (for multi-namespace deployments in combined charts) -namespaceOverride: "" - -## Additional annotations to add to all resources -customAnnotations: {} - # role: custom-metrics - -## Additional labels to add to all resources -customLabels: {} - # monitoring: prometheus-adapter - -# Url to access prometheus -prometheus: - # Value is templated - url: http://prometheus.default.svc - port: 9090 - path: "" - -replicas: 1 - -# k8s 1.21 needs fsGroup to be set for non root deployments -# ref: https://github.com/kubernetes/kubernetes/issues/70679 -podSecurityContext: - fsGroup: 10001 - -# SecurityContext of the container -# ref. https://kubernetes.io/docs/tasks/configure-pod-container/security-context -securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: ["all"] - readOnlyRootFilesystem: true - runAsNonRoot: true - runAsUser: 10001 - seccompProfile: - type: RuntimeDefault - -rbac: - # Specifies whether RBAC resources should be created - create: true - -psp: - # Specifies whether PSP resources should be created - create: false - -serviceAccount: - # Specifies whether a service account should be created - create: true - # The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: - # ServiceAccount annotations. - # Use case: AWS EKS IAM roles for service accounts - # ref: https://docs.aws.amazon.com/eks/latest/userguide/specify-service-account-role.html - annotations: {} - -# Custom DNS configuration to be added to prometheus-adapter pods -dnsConfig: {} - # nameservers: - # - 1.2.3.4 - # searches: - # - ns1.svc.cluster-domain.example - # - my.dns.search.suffix - # options: - # - name: ndots - # value: "2" - # - name: edns0 - -resources: {} - # requests: - # cpu: 100m - # memory: 128Mi - # limits: - # cpu: 100m - # memory: 128Mi - -# Configure liveness probe -# https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#Probe -livenessProbe: - httpGet: - path: /healthz - port: https - scheme: HTTPS - initialDelaySeconds: 30 - timeoutSeconds: 5 - -# Configure readiness probe -readinessProbe: - httpGet: - path: /healthz - port: https - scheme: HTTPS - initialDelaySeconds: 30 - timeoutSeconds: 5 - -rules: - default: true - - custom: [] - # - seriesQuery: '{__name__=~"^some_metric_count$"}' - # resources: - # template: <<.Resource>> - # name: - # matches: "" - # as: "my_custom_metric" - # metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>) - - # Mounts a configMap with pre-generated rules for use. Overrides the - # default, custom, external and resource entries - existing: - - external: [] - # - seriesQuery: '{__name__=~"^some_metric_count$"}' - # resources: - # template: <<.Resource>> - # name: - # matches: "" - # as: "my_external_metric" - # metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>) - - # resource: - # cpu: - # containerQuery: | - # sum by (<<.GroupBy>>) ( - # rate(container_cpu_usage_seconds_total{container!="",<<.LabelMatchers>>}[3m]) - # ) - # nodeQuery: | - # sum by (<<.GroupBy>>) ( - # rate(node_cpu_seconds_total{mode!="idle",mode!="iowait",mode!="steal",<<.LabelMatchers>>}[3m]) - # ) - # resources: - # overrides: - # node: - # resource: node - # namespace: - # resource: namespace - # pod: - # resource: pod - # containerLabel: container - # memory: - # containerQuery: | - # sum by (<<.GroupBy>>) ( - # avg_over_time(container_memory_working_set_bytes{container!="",<<.LabelMatchers>>}[3m]) - # ) - # nodeQuery: | - # sum by (<<.GroupBy>>) ( - # avg_over_time(node_memory_MemTotal_bytes{<<.LabelMatchers>>}[3m]) - # - - # avg_over_time(node_memory_MemAvailable_bytes{<<.LabelMatchers>>}[3m]) - # ) - # resources: - # overrides: - # node: - # resource: node - # namespace: - # resource: namespace - # pod: - # resource: pod - # containerLabel: container - # window: 3m - -service: - annotations: {} - port: 443 - type: ClusterIP - # clusterIP: 1.2.3.4 - -tls: - enable: false - ca: |- - # Public CA file that signed the APIService - key: |- - # Private key of the APIService - certificate: |- - # Public key of the APIService - -# Set environment variables from secrets, configmaps or by setting them as name/value -env: [] - # - name: TMP_DIR - # value: /tmp - # - name: PASSWORD - # valueFrom: - # secretKeyRef: - # name: mysecret - # key: password - # optional: false - -# Any extra arguments -extraArguments: [] - # - --tls-private-key-file=/etc/tls/tls.key - # - --tls-cert-file=/etc/tls/tls.crt - -# Any extra volumes -extraVolumes: [] - # - name: example-name - # hostPath: - # path: /path/on/host - # type: DirectoryOrCreate - # - name: ssl-certs - # hostPath: - # path: /etc/ssl/certs/ca-bundle.crt - # type: File - -# Any extra volume mounts -extraVolumeMounts: [] - # - name: example-name - # mountPath: /path/in/container - # - name: ssl-certs - # mountPath: /etc/ssl/certs/ca-certificates.crt - # readOnly: true - -tolerations: [] - -# Labels added to the pod -podLabels: {} - -# Annotations added to the pod -podAnnotations: {} - -# Annotations added to the deployment -deploymentAnnotations: {} - -hostNetwork: - # Specifies if prometheus-adapter should be started in hostNetwork mode. - # - # You would require this enabled if you use alternate overlay networking for pods and - # API server unable to communicate with metrics-server. As an example, this is required - # if you use Weave network on EKS. See also dnsPolicy - enabled: false - -# When hostNetwork is enabled, you probably want to set this to ClusterFirstWithHostNet -# dnsPolicy: ClusterFirstWithHostNet - -# Deployment strategy type -strategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 25% - maxSurge: 25% - -podDisruptionBudget: - # Specifies if PodDisruptionBudget should be enabled - # When enabled, minAvailable or maxUnavailable should also be defined. - enabled: false - minAvailable: - maxUnavailable: 1 - -certManager: - enabled: false - caCertDuration: 43800h - certDuration: 8760h diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/.helmignore deleted file mode 100644 index f0c1319444..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/.helmignore +++ /dev/null @@ -1,21 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/Chart.yaml deleted file mode 100644 index 08d5f76a4e..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/Chart.yaml +++ /dev/null @@ -1,19 +0,0 @@ -annotations: - artifacthub.io/license: Apache-2.0 - artifacthub.io/links: | - - name: Chart Source - url: https://github.com/prometheus-community/helm-charts -apiVersion: v1 -appVersion: 1.6.0 -home: https://github.com/prometheus/node_exporter/ -maintainers: -- email: gianrubio@gmail.com - name: gianrubio -- email: zanhsieh@gmail.com - name: zanhsieh -- email: rootsandtrees@posteo.de - name: zeritti -name: prometheus-node-exporter -sources: -- https://github.com/prometheus/node_exporter/ -version: 4.20.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/README.md deleted file mode 100644 index 5dbfa32897..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/README.md +++ /dev/null @@ -1,100 +0,0 @@ -# Prometheus `Node Exporter` - -Prometheus exporter for hardware and OS metrics exposed by *NIX kernels, written in Go with pluggable metric collectors. - -This chart bootstraps a prometheus [`Node Exporter`](http://github.com/prometheus/node_exporter) daemonset on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. - -## Get Repository Info - -```console -helm repo add prometheus-community https://prometheus-community.github.io/helm-charts -helm repo update -``` - -_See [`helm repo`](https://helm.sh/docs/helm/helm_repo/) for command documentation._ - -## Install Chart - -```console -helm install [RELEASE_NAME] prometheus-community/prometheus-node-exporter -``` - -_See [configuration](#configuring) below._ - -_See [helm install](https://helm.sh/docs/helm/helm_install/) for command documentation._ - -## Uninstall Chart - -```console -helm uninstall [RELEASE_NAME] -``` - -This removes all the Kubernetes components associated with the chart and deletes the release. - -_See [helm uninstall](https://helm.sh/docs/helm/helm_uninstall/) for command documentation._ - -## Upgrading Chart - -```console -helm upgrade [RELEASE_NAME] [CHART] --install -``` - -_See [helm upgrade](https://helm.sh/docs/helm/helm_upgrade/) for command documentation._ - -### 4.16 to 4.17+ - -`containerSecurityContext.readOnlyRootFilesystem` is set to `true` by default. - -### 3.x to 4.x - -Starting from version 4.0.0, the `node exporter` chart is using the [Kubernetes recommended labels](https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/). Therefore you have to delete the daemonset before you upgrade. - -```console -kubectl delete daemonset -l app=prometheus-node-exporter -helm upgrade -i prometheus-node-exporter prometheus-community/prometheus-node-exporter -``` - -If you use your own custom [ServiceMonitor](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#servicemonitor) or [PodMonitor](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#podmonitor), please ensure to upgrade their `selector` fields accordingly to the new labels. - -### From 2.x to 3.x - -Change the following: - -```yaml -hostRootFsMount: true -``` - -to: - -```yaml -hostRootFsMount: - enabled: true - mountPropagation: HostToContainer -``` - -## Configuring - -See [Customizing the Chart Before Installing](https://helm.sh/docs/intro/using_helm/#customizing-the-chart-before-installing). To see all configurable options with detailed comments, visit the chart's [values.yaml](./values.yaml), or run these configuration commands: - -```console -helm show values prometheus-community/prometheus-node-exporter -``` - -### kube-rbac-proxy - -You can enable `prometheus-node-exporter` endpoint protection using `kube-rbac-proxy`. By setting `kubeRBACProxy.enabled: true`, this chart will deploy a RBAC proxy container protecting the node-exporter endpoint. -To authorize access, authenticate your requests (via a `ServiceAccount` for example) with a `ClusterRole` attached such as: - -```yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: prometheus-node-exporter-read -rules: - - apiGroups: [ "" ] - resources: ["services/node-exporter-prometheus-node-exporter"] - verbs: - - get -``` - -See [kube-rbac-proxy examples](https://github.com/brancz/kube-rbac-proxy/tree/master/examples/resource-attributes) for more details. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/NOTES.txt b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/NOTES.txt deleted file mode 100644 index 8c5391f1f7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/NOTES.txt +++ /dev/null @@ -1,29 +0,0 @@ -1. Get the application URL by running these commands: -{{- if contains "NodePort" .Values.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ template "prometheus-node-exporter.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "prometheus-node-exporter.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ template "prometheus-node-exporter.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 -w {{ template "prometheus-node-exporter.fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ template "prometheus-node-exporter.namespace" . }} {{ template "prometheus-node-exporter.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') - echo http://$SERVICE_IP:{{ .Values.service.port }} -{{- else if contains "ClusterIP" .Values.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ template "prometheus-node-exporter.namespace" . }} -l "app.kubernetes.io/name={{ template "prometheus-node-exporter.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - echo "Visit http://127.0.0.1:{{ .Values.service.port }} to use your application" - kubectl port-forward --namespace {{ template "prometheus-node-exporter.namespace" . }} $POD_NAME {{ .Values.service.port }} -{{- end }} - -{{- if .Values.kubeRBACProxy.enabled}} - -kube-rbac-proxy endpoint protections is enabled: -- Metrics endpoints is now HTTPS -- Ensure that the client authenticates the requests (e.g. via service account) with the following role permissions: -``` -rules: - - apiGroups: [ "" ] - resources: ["services/{{ template "prometheus-node-exporter.fullname" . }}"] - verbs: - - get -``` -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/_helpers.tpl deleted file mode 100644 index 39afbcfd7a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/_helpers.tpl +++ /dev/null @@ -1,219 +0,0 @@ -# Rancher -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "prometheus-node-exporter.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 "prometheus-node-exporter.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 "prometheus-node-exporter.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "prometheus-node-exporter.labels" -}} -helm.sh/chart: {{ include "prometheus-node-exporter.chart" . }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -app.kubernetes.io/component: metrics -app.kubernetes.io/part-of: {{ include "prometheus-node-exporter.name" . }} -{{ include "prometheus-node-exporter.selectorLabels" . }} -{{- with .Chart.AppVersion }} -app.kubernetes.io/version: {{ . | quote }} -{{- end }} -{{- with .Values.podLabels }} -{{ toYaml . }} -{{- end }} -{{- if .Values.releaseLabel }} -release: {{ .Release.Name }} -{{- end }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "prometheus-node-exporter.selectorLabels" -}} -app.kubernetes.io/name: {{ include "prometheus-node-exporter.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - - -{{/* -Create the name of the service account to use -*/}} -{{- define "prometheus-node-exporter.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "prometheus-node-exporter.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} - -{{/* -The image to use -*/}} -{{- define "prometheus-node-exporter.image" -}} -{{- $temp_registry := (include "system_default_registry" .) }} -{{- if .Values.image.sha }} -{{- fail "image.sha forbidden. Use image.digest instead" }} -{{- else if .Values.image.digest }} -{{- if $temp_registry }} -{{- printf "%s%s:%s@%s" $temp_registry .Values.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.image.tag) .Values.image.digest }} -{{- else if .Values.global.imageRegistry }} -{{- printf "%s/%s:%s@%s" .Values.global.imageRegistry .Values.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.image.tag) .Values.image.digest }} -{{- else }} -{{- printf "%s/%s:%s@%s" .Values.image.registry .Values.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.image.tag) .Values.image.digest }} -{{- end }} -{{- else }} -{{- if $temp_registry }} -{{- printf "%s%s:%s" $temp_registry .Values.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.image.tag) }} -{{- else if .Values.global.imageRegistry }} -{{- printf "%s/%s:%s" .Values.global.imageRegistry .Values.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.image.tag) }} -{{- else }} -{{- printf "%s/%s:%s" .Values.image.registry .Values.image.repository (default (printf "v%s" .Chart.AppVersion) .Values.image.tag) }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Allow the release namespace to be overridden for multi-namespace deployments in combined charts -*/}} -{{- define "prometheus-node-exporter.namespace" -}} -{{- if .Values.namespaceOverride }} -{{- .Values.namespaceOverride }} -{{- else }} -{{- .Release.Namespace }} -{{- end }} -{{- end }} - -{{/* -Create the namespace name of the service monitor -*/}} -{{- define "prometheus-node-exporter.monitor-namespace" -}} -{{- if .Values.namespaceOverride }} -{{- .Values.namespaceOverride }} -{{- else }} -{{- if .Values.prometheus.monitor.namespace }} -{{- .Values.prometheus.monitor.namespace }} -{{- else }} -{{- .Release.Namespace }} -{{- end }} -{{- end }} -{{- end }} - -{{/* Sets default scrape limits for servicemonitor */}} -{{- define "servicemonitor.scrapeLimits" -}} -{{- with .sampleLimit }} -sampleLimit: {{ . }} -{{- end }} -{{- with .targetLimit }} -targetLimit: {{ . }} -{{- end }} -{{- with .labelLimit }} -labelLimit: {{ . }} -{{- end }} -{{- with .labelNameLengthLimit }} -labelNameLengthLimit: {{ . }} -{{- end }} -{{- with .labelValueLengthLimit }} -labelValueLengthLimit: {{ . }} -{{- end }} -{{- end }} - -{{/* -Formats imagePullSecrets. Input is (dict "Values" .Values "imagePullSecrets" .{specific imagePullSecrets}) -*/}} -{{- define "prometheus-node-exporter.imagePullSecrets" -}} -{{- range (concat .Values.global.imagePullSecrets .imagePullSecrets) }} - {{- if eq (typeOf .) "map[string]interface {}" }} -- {{ toYaml . | trim }} - {{- else }} -- name: {{ . }} - {{- end }} -{{- end }} -{{- end -}} - -{{/* -Create the namespace name of the pod monitor -*/}} -{{- define "prometheus-node-exporter.podmonitor-namespace" -}} -{{- if .Values.namespaceOverride }} -{{- .Values.namespaceOverride }} -{{- else }} -{{- if .Values.prometheus.podMonitor.namespace }} -{{- .Values.prometheus.podMonitor.namespace }} -{{- else }} -{{- .Release.Namespace }} -{{- end }} -{{- end }} -{{- end }} - -{{/* Sets default scrape limits for podmonitor */}} -{{- define "podmonitor.scrapeLimits" -}} -{{- with .sampleLimit }} -sampleLimit: {{ . }} -{{- end }} -{{- with .targetLimit }} -targetLimit: {{ . }} -{{- end }} -{{- with .labelLimit }} -labelLimit: {{ . }} -{{- end }} -{{- with .labelNameLengthLimit }} -labelNameLengthLimit: {{ . }} -{{- end }} -{{- with .labelValueLengthLimit }} -labelValueLengthLimit: {{ . }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/clusterrole.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/clusterrole.yaml deleted file mode 100644 index 1fd91150f4..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/clusterrole.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if and (eq .Values.rbac.create true) (eq .Values.kubeRBACProxy.enabled true) -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ include "prometheus-node-exporter.fullname" . }} - namespace: {{ include "prometheus-node-exporter.namespace" . }} - labels: - {{- include "prometheus-node-exporter.labels" . | nindent 4 }} -rules: - {{- if $.Values.kubeRBACProxy.enabled }} - - apiGroups: [ "authentication.k8s.io" ] - resources: - - tokenreviews - verbs: [ "create" ] - - apiGroups: [ "authorization.k8s.io" ] - resources: - - subjectaccessreviews - verbs: [ "create" ] - {{- end }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/clusterrolebinding.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/clusterrolebinding.yaml deleted file mode 100644 index 653305ad9e..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/clusterrolebinding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if and (eq .Values.rbac.create true) (eq .Values.kubeRBACProxy.enabled true) -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - {{- include "prometheus-node-exporter.labels" . | nindent 4 }} - name: {{ template "prometheus-node-exporter.fullname" . }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole -{{- if .Values.rbac.useExistingRole }} - name: {{ .Values.rbac.useExistingRole }} -{{- else }} - name: {{ template "prometheus-node-exporter.fullname" . }} -{{- end }} -subjects: -- kind: ServiceAccount - name: {{ template "prometheus-node-exporter.serviceAccountName" . }} - namespace: {{ template "prometheus-node-exporter.namespace" . }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/daemonset.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/daemonset.yaml deleted file mode 100644 index 0a99ce79f5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/daemonset.yaml +++ /dev/null @@ -1,285 +0,0 @@ -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: {{ include "prometheus-node-exporter.fullname" . }} - namespace: {{ include "prometheus-node-exporter.namespace" . }} - labels: - {{- include "prometheus-node-exporter.labels" . | nindent 4 }} - {{- with .Values.daemonsetAnnotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - selector: - matchLabels: - {{- include "prometheus-node-exporter.selectorLabels" . | nindent 6 }} - {{- with .Values.updateStrategy }} - updateStrategy: - {{- toYaml . | nindent 4 }} - {{- end }} - template: - metadata: - {{- with .Values.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "prometheus-node-exporter.labels" . | nindent 8 }} - spec: - automountServiceAccountToken: {{ ternary true false (or .Values.serviceAccount.automountServiceAccountToken .Values.kubeRBACProxy.enabled) }} - {{- with .Values.securityContext }} - securityContext: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.priorityClassName }} - priorityClassName: {{ . }} - {{- end }} - {{- with .Values.extraInitContainers }} - initContainers: - {{- toYaml . | nindent 8 }} - {{- end }} - serviceAccountName: {{ include "prometheus-node-exporter.serviceAccountName" . }} - containers: - {{- $servicePort := ternary 8100 .Values.service.port .Values.kubeRBACProxy.enabled }} - - name: node-exporter - image: {{ include "prometheus-node-exporter.image" . }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - args: - - --path.procfs=/host/proc - - --path.sysfs=/host/sys - {{- if .Values.hostRootFsMount.enabled }} - - --path.rootfs=/host/root - {{- if semverCompare ">=1.4.0" (default .Chart.AppVersion .Values.image.tag) }} - - --path.udev.data=/host/root/run/udev/data - {{- end }} - {{- end }} - - --web.listen-address=[$(HOST_IP)]:{{ $servicePort }} - {{- with .Values.extraArgs }} - {{- toYaml . | nindent 12 }} - {{- end }} - {{- with .Values.containerSecurityContext }} - securityContext: - {{- toYaml . | nindent 12 }} - {{- end }} - env: - - name: HOST_IP - {{- if .Values.kubeRBACProxy.enabled }} - value: 127.0.0.1 - {{- else if .Values.service.listenOnAllInterfaces }} - value: 0.0.0.0 - {{- else }} - valueFrom: - fieldRef: - apiVersion: v1 - fieldPath: status.hostIP - {{- end }} - {{- range $key, $value := .Values.env }} - - name: {{ $key }} - value: {{ $value | quote }} - {{- end }} - {{- if eq .Values.kubeRBACProxy.enabled false }} - ports: - - name: {{ .Values.service.portName }} - containerPort: {{ .Values.service.port }} - protocol: TCP - {{- end }} - livenessProbe: - failureThreshold: {{ .Values.livenessProbe.failureThreshold }} - httpGet: - {{- if .Values.kubeRBACProxy.enabled }} - host: 127.0.0.1 - {{- end }} - httpHeaders: - {{- range $_, $header := .Values.livenessProbe.httpGet.httpHeaders }} - - name: {{ $header.name }} - value: {{ $header.value }} - {{- end }} - path: / - port: {{ $servicePort }} - scheme: {{ upper .Values.livenessProbe.httpGet.scheme }} - initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.livenessProbe.periodSeconds }} - successThreshold: {{ .Values.livenessProbe.successThreshold }} - timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} - readinessProbe: - failureThreshold: {{ .Values.readinessProbe.failureThreshold }} - httpGet: - {{- if .Values.kubeRBACProxy.enabled }} - host: 127.0.0.1 - {{- end }} - httpHeaders: - {{- range $_, $header := .Values.readinessProbe.httpGet.httpHeaders }} - - name: {{ $header.name }} - value: {{ $header.value }} - {{- end }} - path: / - port: {{ $servicePort }} - scheme: {{ upper .Values.readinessProbe.httpGet.scheme }} - initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.readinessProbe.periodSeconds }} - successThreshold: {{ .Values.readinessProbe.successThreshold }} - timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} - {{- with .Values.resources }} - resources: - {{- toYaml . | nindent 12 }} - {{- end }} - volumeMounts: - - name: proc - mountPath: /host/proc - readOnly: true - - name: sys - mountPath: /host/sys - readOnly: true - {{- if .Values.hostRootFsMount.enabled }} - - name: root - mountPath: /host/root - {{- with .Values.hostRootFsMount.mountPropagation }} - mountPropagation: {{ . }} - {{- end }} - readOnly: true - {{- end }} - {{- range $_, $mount := .Values.extraHostVolumeMounts }} - - name: {{ $mount.name }} - mountPath: {{ $mount.mountPath }} - readOnly: {{ $mount.readOnly }} - {{- with $mount.mountPropagation }} - mountPropagation: {{ . }} - {{- end }} - {{- end }} - {{- range $_, $mount := .Values.sidecarVolumeMount }} - - name: {{ $mount.name }} - mountPath: {{ $mount.mountPath }} - readOnly: true - {{- end }} - {{- range $_, $mount := .Values.configmaps }} - - name: {{ $mount.name }} - mountPath: {{ $mount.mountPath }} - {{- end }} - {{- range $_, $mount := .Values.secrets }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - {{- end }} - {{- with .Values.sidecars }} - {{- toYaml . | nindent 8 }} - {{- if or $.Values.sidecarVolumeMount $.Values.sidecarHostVolumeMounts }} - volumeMounts: - {{- range $_, $mount := $.Values.sidecarVolumeMount }} - - name: {{ $mount.name }} - mountPath: {{ $mount.mountPath }} - readOnly: {{ $mount.readOnly }} - {{- end }} - {{- range $_, $mount := $.Values.sidecarHostVolumeMounts }} - - name: {{ $mount.name }} - mountPath: {{ $mount.mountPath }} - readOnly: {{ $mount.readOnly }} - {{- if $mount.mountPropagation }} - mountPropagation: {{ $mount.mountPropagation }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.kubeRBACProxy.enabled }} - - name: kube-rbac-proxy - args: - {{- if .Values.kubeRBACProxy.extraArgs }} - {{- .Values.kubeRBACProxy.extraArgs | toYaml | nindent 12 }} - {{- end }} - - --secure-listen-address=:{{ .Values.service.port}} - - --upstream=http://127.0.0.1:{{ $servicePort }}/ - - --proxy-endpoints-port=8888 - - --config-file=/etc/kube-rbac-proxy-config/config-file.yaml - volumeMounts: - - name: kube-rbac-proxy-config - mountPath: /etc/kube-rbac-proxy-config - imagePullPolicy: {{ .Values.kubeRBACProxy.image.pullPolicy }} - {{- $base_registry := (include "monitoring_registry" .) }} - {{- if .Values.kubeRBACProxy.image.sha }} - image: "{{ $base_registry | default .Values.kubeRBACProxy.image.registry}}/{{ .Values.kubeRBACProxy.image.repository }}:{{ .Values.kubeRBACProxy.image.tag }}@sha256:{{ .Values.kubeRBACProxy.image.sha }}" - {{- else }} - image: "{{ $base_registry | default .Values.kubeRBACProxy.image.registry}}/{{ .Values.kubeRBACProxy.image.repository }}:{{ .Values.kubeRBACProxy.image.tag }}" - {{- end }} - ports: - - containerPort: {{ .Values.service.port}} - name: "http" - - containerPort: 8888 - name: "http-healthz" - readinessProbe: - httpGet: - scheme: HTTPS - port: 8888 - path: healthz - initialDelaySeconds: 5 - timeoutSeconds: 5 - {{- if .Values.kubeRBACProxy.resources }} - resources: - {{ toYaml .Values.kubeRBACProxy.resources | nindent 12 }} - {{- end }} - {{- if .Values.kubeRBACProxy.containerSecurityContext }} - securityContext: - {{ toYaml .Values.kubeRBACProxy.containerSecurityContext | nindent 12 }} - {{- end }} - {{- end }} - {{- if or .Values.imagePullSecrets .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- include "prometheus-node-exporter.imagePullSecrets" (dict "Values" .Values "imagePullSecrets" .Values.imagePullSecrets) | indent 8 }} - {{- end }} - hostNetwork: {{ .Values.hostNetwork }} - hostPID: {{ .Values.hostPID }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.dnsConfig }} - dnsConfig: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - volumes: - - name: proc - hostPath: - path: /proc - - name: sys - hostPath: - path: /sys - {{- if .Values.hostRootFsMount.enabled }} - - name: root - hostPath: - path: / - {{- end }} - {{- range $_, $mount := .Values.extraHostVolumeMounts }} - - name: {{ $mount.name }} - hostPath: - path: {{ $mount.hostPath }} - {{- end }} - {{- range $_, $mount := .Values.sidecarVolumeMount }} - - name: {{ $mount.name }} - emptyDir: - medium: Memory - {{- end }} - {{- range $_, $mount := .Values.sidecarHostVolumeMounts }} - - name: {{ $mount.name }} - hostPath: - path: {{ $mount.hostPath }} - {{- end }} - {{- range $_, $mount := .Values.configmaps }} - - name: {{ $mount.name }} - configMap: - name: {{ $mount.name }} - {{- end }} - {{- range $_, $mount := .Values.secrets }} - - name: {{ $mount.name }} - secret: - secretName: {{ $mount.name }} - {{- end }} - {{- if .Values.kubeRBACProxy.enabled }} - - name: kube-rbac-proxy-config - configMap: - name: {{ template "prometheus-node-exporter.fullname" . }}-rbac-config - {{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/endpoints.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/endpoints.yaml deleted file mode 100644 index 56b695203a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/endpoints.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- if .Values.endpoints }} -apiVersion: v1 -kind: Endpoints -metadata: - name: {{ include "prometheus-node-exporter.fullname" . }} - namespace: {{ include "prometheus-node-exporter.namespace" . }} - labels: - {{- include "prometheus-node-exporter.labels" . | nindent 4 }} -subsets: - - addresses: - {{- range .Values.endpoints }} - - ip: {{ . }} - {{- end }} - ports: - - name: {{ .Values.service.portName }} - port: {{ .Values.service.port }} - protocol: TCP -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/extra-manifests.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/extra-manifests.yaml deleted file mode 100644 index 567f7bf329..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/extra-manifests.yaml +++ /dev/null @@ -1,4 +0,0 @@ -{{ range .Values.extraManifests }} ---- -{{ tpl (toYaml .) $ }} -{{ end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/networkpolicy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/networkpolicy.yaml deleted file mode 100644 index 825722729d..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/networkpolicy.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if .Values.networkPolicy.enabled }} -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: {{ include "prometheus-node-exporter.fullname" . }} - namespace: {{ include "prometheus-node-exporter.namespace" . }} - labels: - {{- include "prometheus-node-exporter.labels" $ | nindent 4 }} - {{- with .Values.service.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - ingress: - - ports: - - port: {{ .Values.service.port }} - policyTypes: - - Egress - - Ingress - podSelector: - matchLabels: - {{- include "prometheus-node-exporter.selectorLabels" . | nindent 6 }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/podmonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/podmonitor.yaml deleted file mode 100644 index f88da6a34e..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/podmonitor.yaml +++ /dev/null @@ -1,91 +0,0 @@ -{{- if .Values.prometheus.podMonitor.enabled }} -apiVersion: {{ .Values.prometheus.podMonitor.apiVersion | default "monitoring.coreos.com/v1" }} -kind: PodMonitor -metadata: - name: {{ include "prometheus-node-exporter.fullname" . }} - namespace: {{ include "prometheus-node-exporter.podmonitor-namespace" . }} - labels: - {{- include "prometheus-node-exporter.labels" . | nindent 4 }} - {{- with .Values.prometheus.podMonitor.additionalLabels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - jobLabel: {{ default "app.kubernetes.io/name" .Values.prometheus.podMonitor.jobLabel }} - {{- include "podmonitor.scrapeLimits" .Values.prometheus.podMonitor | nindent 2 }} - selector: - matchLabels: - {{- with .Values.prometheus.podMonitor.selectorOverride }} - {{- toYaml . | nindent 6 }} - {{- else }} - {{- include "prometheus-node-exporter.selectorLabels" . | nindent 6 }} - {{- end }} - namespaceSelector: - matchNames: - - {{ include "prometheus-node-exporter.namespace" . }} - {{- with .Values.prometheus.podMonitor.attachMetadata }} - attachMetadata: - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.prometheus.podMonitor.podTargetLabels }} - podTargetLabels: - {{- toYaml . | nindent 4 }} - {{- end }} - podMetricsEndpoints: - - port: {{ .Values.service.portName }} - {{- with .Values.prometheus.podMonitor.scheme }} - scheme: {{ . }} - {{- end }} - {{- with .Values.prometheus.podMonitor.path }} - path: {{ . }} - {{- end }} - {{- with .Values.prometheus.podMonitor.basicAuth }} - basicAuth: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.prometheus.podMonitor.bearerTokenSecret }} - bearerTokenSecret: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.prometheus.podMonitor.tlsConfig }} - tlsConfig: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.prometheus.podMonitor.authorization }} - authorization: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.prometheus.podMonitor.oauth2 }} - oauth2: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.prometheus.podMonitor.proxyUrl }} - proxyUrl: {{ . }} - {{- end }} - {{- with .Values.prometheus.podMonitor.interval }} - interval: {{ . }} - {{- end }} - {{- with .Values.prometheus.podMonitor.honorTimestamps }} - honorTimestamps: {{ . }} - {{- end }} - {{- with .Values.prometheus.podMonitor.honorLabels }} - honorLabels: {{ . }} - {{- end }} - {{- with .Values.prometheus.podMonitor.scrapeTimeout }} - scrapeTimeout: {{ . }} - {{- end }} - {{- with .Values.prometheus.podMonitor.relabelings }} - relabelings: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.prometheus.podMonitor.metricRelabelings }} - metricRelabelings: - {{- toYaml . | nindent 8 }} - {{- end }} - enableHttp2: {{ default false .Values.prometheus.podMonitor.enableHttp2 }} - filterRunning: {{ default true .Values.prometheus.podMonitor.filterRunning }} - followRedirects: {{ default false .Values.prometheus.podMonitor.followRedirects }} - {{- with .Values.prometheus.podMonitor.params }} - params: - {{- toYaml . | nindent 8 }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/psp-clusterrole.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/psp-clusterrole.yaml deleted file mode 100644 index ee5bbba4a5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/psp-clusterrole.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if and (or .Values.global.cattle.psp.enable (and .Values.rbac.create .Values.rbac.pspEnabled)) (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: psp-{{ include "prometheus-node-exporter.fullname" . }} - labels: - {{- include "prometheus-node-exporter.labels" . | nindent 4 }} -rules: -- apiGroups: ['extensions'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ include "prometheus-node-exporter.fullname" . }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/psp-clusterrolebinding.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/psp-clusterrolebinding.yaml deleted file mode 100644 index 160f2bbf7a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/psp-clusterrolebinding.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if and (or .Values.global.cattle.psp.enable (and .Values.rbac.create .Values.rbac.pspEnabled)) (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: psp-{{ include "prometheus-node-exporter.fullname" . }} - labels: - {{- include "prometheus-node-exporter.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: psp-{{ include "prometheus-node-exporter.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ include "prometheus-node-exporter.fullname" . }} - namespace: {{ include "prometheus-node-exporter.namespace" . }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/psp.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/psp.yaml deleted file mode 100644 index f3b52e1120..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/psp.yaml +++ /dev/null @@ -1,49 +0,0 @@ -{{- if and (or .Values.global.cattle.psp.enable (and .Values.rbac.create .Values.rbac.pspEnabled)) (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ include "prometheus-node-exporter.fullname" . }} - namespace: {{ include "prometheus-node-exporter.namespace" . }} - labels: - {{- include "prometheus-node-exporter.labels" . | nindent 4 }} - {{- with .Values.rbac.pspAnnotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - privileged: false - # Allow core volume types. - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'secret' - - 'downwardAPI' - - 'persistentVolumeClaim' - - 'hostPath' - hostNetwork: true - hostIPC: false - hostPID: true - hostPorts: - - min: 0 - max: 65535 - runAsUser: - # Permits the container to run with root privileges as well. - rule: 'RunAsAny' - seLinux: - # This policy assumes the nodes are using AppArmor rather than SELinux. - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - # Allow adding the root group. - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - # Allow adding the root group. - - min: 0 - max: 65535 - readOnlyRootFilesystem: false -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/rbac-configmap.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/rbac-configmap.yaml deleted file mode 100644 index d8606b1c59..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/rbac-configmap.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{- if .Values.kubeRBACProxy.enabled}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "prometheus-node-exporter.fullname" . }}-rbac-config -data: - config-file.yaml: |+ - authorization: - resourceAttributes: - namespace: {{ template "prometheus-node-exporter.namespace" . }} - apiVersion: v1 - resource: services - subresource: {{ template "prometheus-node-exporter.fullname" . }} - name: {{ template "prometheus-node-exporter.fullname" . }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/service.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/service.yaml deleted file mode 100644 index c0129dbdc9..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/service.yaml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "prometheus-node-exporter.fullname" . }} - namespace: {{ include "prometheus-node-exporter.namespace" . }} - labels: - {{- include "prometheus-node-exporter.labels" $ | nindent 4 }} - {{- with .Values.service.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - {{- if ( and (eq .Values.service.type "NodePort" ) (not (empty .Values.service.nodePort)) ) }} - nodePort: {{ .Values.service.nodePort }} - {{- end }} - targetPort: {{ .Values.service.targetPort }} - protocol: TCP - name: {{ .Values.service.portName }} - selector: - {{- include "prometheus-node-exporter.selectorLabels" . | nindent 4 }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/serviceaccount.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/serviceaccount.yaml deleted file mode 100644 index 5c3348c09b..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/serviceaccount.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if and .Values.rbac.create .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "prometheus-node-exporter.serviceAccountName" . }} - namespace: {{ include "prometheus-node-exporter.namespace" . }} - labels: - {{- include "prometheus-node-exporter.labels" . | nindent 4 }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -{{- if or .Values.serviceAccount.imagePullSecrets .Values.global.imagePullSecrets }} -imagePullSecrets: - {{- include "prometheus-node-exporter.imagePullSecrets" (dict "Values" .Values "imagePullSecrets" .Values.serviceAccount.imagePullSecrets) | indent 2 }} -{{- end }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/servicemonitor.yaml deleted file mode 100644 index 6d6e440473..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/servicemonitor.yaml +++ /dev/null @@ -1,71 +0,0 @@ -{{- if .Values.prometheus.monitor.enabled }} -apiVersion: {{ .Values.prometheus.monitor.apiVersion | default "monitoring.coreos.com/v1" }} -kind: ServiceMonitor -metadata: - name: {{ include "prometheus-node-exporter.fullname" . }} - namespace: {{ include "prometheus-node-exporter.monitor-namespace" . }} - labels: - {{- include "prometheus-node-exporter.labels" . | nindent 4 }} - {{- with .Values.prometheus.monitor.additionalLabels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - jobLabel: {{ default "app.kubernetes.io/name" .Values.prometheus.monitor.jobLabel }} - {{- include "servicemonitor.scrapeLimits" .Values.prometheus.monitor | nindent 2 }} - {{- with .Values.prometheus.monitor.podTargetLabels }} - podTargetLabels: - {{- toYaml . | nindent 4 }} - {{- end }} - selector: - matchLabels: - {{- with .Values.prometheus.monitor.selectorOverride }} - {{- toYaml . | nindent 6 }} - {{- else }} - {{- include "prometheus-node-exporter.selectorLabels" . | nindent 6 }} - {{- end }} - {{- with .Values.prometheus.monitor.attachMetadata }} - attachMetadata: - {{- toYaml . | nindent 4 }} - {{- end }} - endpoints: - - port: {{ .Values.service.portName }} - scheme: {{ .Values.prometheus.monitor.scheme }} - {{- with .Values.prometheus.monitor.basicAuth }} - basicAuth: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.prometheus.monitor.bearerTokenFile }} - bearerTokenFile: {{ . }} - {{- end }} - {{- with .Values.prometheus.monitor.tlsConfig }} - tlsConfig: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.prometheus.monitor.proxyUrl }} - proxyUrl: {{ . }} - {{- end }} - {{- with .Values.prometheus.monitor.interval }} - interval: {{ . }} - {{- end }} - {{- with .Values.prometheus.monitor.scrapeTimeout }} - scrapeTimeout: {{ . }} - {{- end }} - {{- with .Values.prometheus.monitor.relabelings }} - relabelings: - {{- toYaml . | nindent 8 }} - {{- end }} - metricRelabelings: - {{- with .Values.prometheus.monitor.metricRelabelings }} - {{- toYaml . | nindent 8 }} - {{- end }} - {{ if .Values.global.cattle.clusterId }} - - sourceLabels: [__address__] - targetLabel: cluster_id - replacement: {{ .Values.global.cattle.clusterId }} - {{- end }} - {{ if .Values.global.cattle.clusterName }} - - sourceLabels: [__address__] - targetLabel: cluster_name - replacement: {{ .Values.global.cattle.clusterName }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/verticalpodautoscaler.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/verticalpodautoscaler.yaml deleted file mode 100644 index 2c2705f872..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/templates/verticalpodautoscaler.yaml +++ /dev/null @@ -1,40 +0,0 @@ -{{- if and (.Capabilities.APIVersions.Has "autoscaling.k8s.io/v1") (.Values.verticalPodAutoscaler.enabled) }} -apiVersion: autoscaling.k8s.io/v1 -kind: VerticalPodAutoscaler -metadata: - name: {{ include "prometheus-node-exporter.fullname" . }} - namespace: {{ include "prometheus-node-exporter.namespace" . }} - labels: - {{- include "prometheus-node-exporter.labels" . | nindent 4 }} -spec: - {{- with .Values.verticalPodAutoscaler.recommenders }} - recommenders: - {{- toYaml . | nindent 4 }} - {{- end }} - resourcePolicy: - containerPolicies: - - containerName: node-exporter - {{- with .Values.verticalPodAutoscaler.controlledResources }} - controlledResources: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.verticalPodAutoscaler.controlledValues }} - controlledValues: {{ . }} - {{- end }} - {{- with .Values.verticalPodAutoscaler.maxAllowed }} - maxAllowed: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.verticalPodAutoscaler.minAllowed }} - minAllowed: - {{- toYaml . | nindent 8 }} - {{- end }} - targetRef: - apiVersion: apps/v1 - kind: DaemonSet - name: {{ include "prometheus-node-exporter.fullname" . }} - {{- with .Values.verticalPodAutoscaler.updatePolicy }} - updatePolicy: - {{- toYaml . | nindent 4 }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/values.yaml deleted file mode 100644 index fe35dfe99c..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/prometheus-node-exporter/values.yaml +++ /dev/null @@ -1,475 +0,0 @@ -# Default values for prometheus-node-exporter. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -image: - registry: docker.io - repository: rancher/mirrored-prometheus-node-exporter - # Overrides the image tag whose default is {{ printf "v%s" .Chart.AppVersion }} - tag: v1.3.1 - pullPolicy: IfNotPresent - digest: "" - -imagePullSecrets: [] -# - name: "image-pull-secret" -nameOverride: "" -fullnameOverride: "" - -global: - cattle: - psp: - enable: true - systemDefaultRegistry: "" - - # To help compatibility with other charts which use global.imagePullSecrets. - # Allow either an array of {name: pullSecret} maps (k8s-style), or an array of strings (more common helm-style). - # global: - # imagePullSecrets: - # - name: pullSecret1 - # - name: pullSecret2 - # or - # global: - # imagePullSecrets: - # - pullSecret1 - # - pullSecret2 - imagePullSecrets: [] - # - # Allow parent charts to override registry hostname - imageRegistry: "docker.io" - -# Configure kube-rbac-proxy. When enabled, creates a kube-rbac-proxy to protect the node-exporter http endpoint. -# The requests are served through the same service but requests are HTTPS. -kubeRBACProxy: - enabled: false - image: - registry: docker.io - repository: rancher/mirrored-kube-rbac-proxy - tag: v0.14.0 - sha: "" - pullPolicy: IfNotPresent - - # List of additional cli arguments to configure kube-rbac-prxy - # for example: --tls-cipher-suites, --log-file, etc. - # all the possible args can be found here: https://github.com/brancz/kube-rbac-proxy#usage - extraArgs: [] - - ## Specify security settings for a Container - ## Allows overrides and additional options compared to (Pod) securityContext - ## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container - containerSecurityContext: {} - - 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:'. - # limits: - # cpu: 100m - # memory: 64Mi - # requests: - # cpu: 10m - # memory: 32Mi - -service: - type: ClusterIP - port: 9796 - targetPort: 9796 - nodePort: - portName: metrics - listenOnAllInterfaces: true - annotations: - prometheus.io/scrape: "true" - -# Set a NetworkPolicy with: -# ingress only on service.port -# no egress permitted -networkPolicy: - enabled: false - -# Additional environment variables that will be passed to the daemonset -env: {} -## env: -## VARIABLE: value - -prometheus: - monitor: - enabled: false - additionalLabels: {} - namespace: "" - - jobLabel: "" - - # List of pod labels to add to node exporter metrics - # https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#servicemonitor - podTargetLabels: [] - - scheme: http - basicAuth: {} - bearerTokenFile: - tlsConfig: {} - - ## proxyUrl: URL of a proxy that should be used for scraping. - ## - proxyUrl: "" - - ## Override serviceMonitor selector - ## - selectorOverride: {} - - ## Attach node metadata to discovered targets. Requires Prometheus v2.35.0 and above. - ## - attachMetadata: - node: false - - relabelings: [] - metricRelabelings: [] - interval: "" - scrapeTimeout: 10s - ## prometheus.monitor.apiVersion ApiVersion for the serviceMonitor Resource(defaults to "monitoring.coreos.com/v1") - apiVersion: "" - - ## SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. - ## - sampleLimit: 0 - - ## TargetLimit defines a limit on the number of scraped targets that will be accepted. - ## - targetLimit: 0 - - ## Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelLimit: 0 - - ## Per-scrape limit on length of labels name that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelNameLengthLimit: 0 - - ## Per-scrape limit on length of labels value that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelValueLengthLimit: 0 - - # PodMonitor defines monitoring for a set of pods. - # ref. https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#monitoring.coreos.com/v1.PodMonitor - # Using a PodMonitor may be preferred in some environments where there is very large number - # of Node Exporter endpoints (1000+) behind a single service. - # The PodMonitor is disabled by default. When switching from ServiceMonitor to PodMonitor, - # the time series resulting from the configuration through PodMonitor may have different labels. - # For instance, there will not be the service label any longer which might - # affect PromQL queries selecting that label. - podMonitor: - enabled: false - # Namespace in which to deploy the pod monitor. Defaults to the release namespace. - namespace: "" - # Additional labels, e.g. setting a label for pod monitor selector as set in prometheus - additionalLabels: {} - # release: kube-prometheus-stack - # PodTargetLabels transfers labels of the Kubernetes Pod onto the target. - podTargetLabels: [] - # apiVersion defaults to monitoring.coreos.com/v1. - apiVersion: "" - # Override pod selector to select pod objects. - selectorOverride: {} - # Attach node metadata to discovered targets. Requires Prometheus v2.35.0 and above. - attachMetadata: - node: false - # The label to use to retrieve the job name from. Defaults to label app.kubernetes.io/name. - jobLabel: "" - - # Scheme/protocol to use for scraping. - scheme: "http" - # Path to scrape metrics at. - path: "/metrics" - - # BasicAuth allow an endpoint to authenticate over basic authentication. - # More info: https://prometheus.io/docs/operating/configuration/#endpoint - basicAuth: {} - # Secret to mount to read bearer token for scraping targets. - # The secret needs to be in the same namespace as the pod monitor and accessible by the Prometheus Operator. - # https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.24/#secretkeyselector-v1-core - bearerTokenSecret: {} - # TLS configuration to use when scraping the endpoint. - tlsConfig: {} - # Authorization section for this endpoint. - # https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#monitoring.coreos.com/v1.SafeAuthorization - authorization: {} - # OAuth2 for the URL. Only valid in Prometheus versions 2.27.0 and newer. - # https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#monitoring.coreos.com/v1.OAuth2 - oauth2: {} - - # ProxyURL eg http://proxyserver:2195. Directs scrapes through proxy to this endpoint. - proxyUrl: "" - # Interval at which endpoints should be scraped. If not specified Prometheus’ global scrape interval is used. - interval: "" - # Timeout after which the scrape is ended. If not specified, the Prometheus global scrape interval is used. - scrapeTimeout: "" - # HonorTimestamps controls whether Prometheus respects the timestamps present in scraped data. - honorTimestamps: true - # HonorLabels chooses the metric’s labels on collisions with target labels. - honorLabels: true - # Whether to enable HTTP2. Default false. - enableHttp2: "" - # Drop pods that are not running. (Failed, Succeeded). - # Enabled by default. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase - filterRunning: "" - # FollowRedirects configures whether scrape requests follow HTTP 3xx redirects. Default false. - followRedirects: "" - # Optional HTTP URL parameters - params: {} - - # RelabelConfigs to apply to samples before scraping. Prometheus Operator automatically adds - # relabelings for a few standard Kubernetes fields. The original scrape job’s name - # is available via the __tmp_prometheus_job_name label. - # More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config - relabelings: [] - # MetricRelabelConfigs to apply to samples before ingestion. - metricRelabelings: [] - - # SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. - sampleLimit: 0 - # TargetLimit defines a limit on the number of scraped targets that will be accepted. - targetLimit: 0 - # Per-scrape limit on number of labels that will be accepted for a sample. - # Only valid in Prometheus versions 2.27.0 and newer. - labelLimit: 0 - # Per-scrape limit on length of labels name that will be accepted for a sample. - # Only valid in Prometheus versions 2.27.0 and newer. - labelNameLengthLimit: 0 - # Per-scrape limit on length of labels value that will be accepted for a sample. - # Only valid in Prometheus versions 2.27.0 and newer. - labelValueLengthLimit: 0 - -## Customize the updateStrategy if set -updateStrategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 1 - -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:'. - # limits: - # cpu: 200m - # memory: 50Mi - # requests: - # cpu: 100m - # memory: 30Mi - -serviceAccount: - # Specifies whether a ServiceAccount should be created - create: true - # The name of the ServiceAccount to use. - # If not set and create is true, a name is generated using the fullname template - name: - annotations: {} - imagePullSecrets: [] - automountServiceAccountToken: false - -securityContext: - fsGroup: 65534 - runAsGroup: 65534 - runAsNonRoot: true - runAsUser: 65534 - -containerSecurityContext: - readOnlyRootFilesystem: true - # capabilities: - # add: - # - SYS_TIME - -rbac: - ## If true, create & use RBAC resources - ## - create: true - pspAnnotations: {} - -# for deployments that have node_exporter deployed outside of the cluster, list -# their addresses here -endpoints: [] - -# Expose the service to the host network -hostNetwork: true - -# Share the host process ID namespace -hostPID: true - -# Mount the node's root file system (/) at /host/root in the container -hostRootFsMount: - enabled: true - # Defines how new mounts in existing mounts on the node or in the container - # are propagated to the container or node, respectively. Possible values are - # None, HostToContainer, and Bidirectional. If this field is omitted, then - # None is used. More information on: - # https://kubernetes.io/docs/concepts/storage/volumes/#mount-propagation - mountPropagation: HostToContainer - -## Assign a group of affinity scheduling rules -## -affinity: {} -# nodeAffinity: -# requiredDuringSchedulingIgnoredDuringExecution: -# nodeSelectorTerms: -# - matchFields: -# - key: metadata.name -# operator: In -# values: -# - target-host-name - -# Annotations to be added to node exporter pods -podAnnotations: - # Fix for very slow GKE cluster upgrades - cluster-autoscaler.kubernetes.io/safe-to-evict: "true" - -# Extra labels to be added to node exporter pods -podLabels: {} - -# Annotations to be added to node exporter daemonset -daemonsetAnnotations: {} - -## set to true to add the release label so scraping of the servicemonitor with kube-prometheus-stack works out of the box -releaseLabel: false - -# Custom DNS configuration to be added to prometheus-node-exporter pods -dnsConfig: {} -# nameservers: -# - 1.2.3.4 -# searches: -# - ns1.svc.cluster-domain.example -# - my.dns.search.suffix -# options: -# - name: ndots -# value: "2" -# - name: edns0 - -## Assign a nodeSelector if operating a hybrid cluster -## -nodeSelector: - kubernetes.io/os: linux - # kubernetes.io/arch: amd64 - -tolerations: - - effect: NoSchedule - operator: Exists - - effect: NoExecute - operator: Exists - -## Assign a PriorityClassName to pods if set -# priorityClassName: "" - -## Additional container arguments -## -extraArgs: [] -# - --collector.diskstats.ignored-devices=^(ram|loop|fd|(h|s|v)d[a-z]|nvme\\d+n\\d+p)\\d+$ -# - --collector.textfile.directory=/run/prometheus - -## Additional mounts from the host to node-exporter container -## -extraHostVolumeMounts: [] -# - name: -# hostPath: -# mountPath: -# readOnly: true|false -# mountPropagation: None|HostToContainer|Bidirectional - -## Additional configmaps to be mounted. -## -configmaps: [] -# - name: -# mountPath: -secrets: [] -# - name: -# mountPath: -## Override the deployment namespace -## -namespaceOverride: "" - -## Additional containers for export metrics to text file -## -sidecars: [] -## - name: nvidia-dcgm-exporter -## image: nvidia/dcgm-exporter:1.4.3 - -## Volume for sidecar containers -## -sidecarVolumeMount: [] -## - name: collector-textfiles -## mountPath: /run/prometheus -## readOnly: false - -## Additional mounts from the host to sidecar containers -## -sidecarHostVolumeMounts: [] -# - name: -# hostPath: -# mountPath: -# readOnly: true|false -# mountPropagation: None|HostToContainer|Bidirectional - -## Additional InitContainers to initialize the pod -## -extraInitContainers: [] - -## Liveness probe -## -livenessProbe: - failureThreshold: 3 - httpGet: - httpHeaders: [] - scheme: http - initialDelaySeconds: 0 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 1 - -## Readiness probe -## -readinessProbe: - failureThreshold: 3 - httpGet: - httpHeaders: [] - scheme: http - initialDelaySeconds: 0 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 1 - -# Enable vertical pod autoscaler support for prometheus-node-exporter -verticalPodAutoscaler: - enabled: false - - # Recommender responsible for generating recommendation for the object. - # List should be empty (then the default recommender will generate the recommendation) - # or contain exactly one recommender. - # recommenders: - # - name: custom-recommender-performance - - # List of resources that the vertical pod autoscaler can control. Defaults to cpu and memory - controlledResources: [] - # Specifies which resource values should be controlled: RequestsOnly or RequestsAndLimits. - # controlledValues: RequestsAndLimits - - # Define the max allowed resources for the pod - maxAllowed: {} - # cpu: 200m - # memory: 100Mi - # Define the min allowed resources for the pod - minAllowed: {} - # cpu: 200m - # memory: 100Mi - - # updatePolicy: - # Specifies minimal number of replicas which need to be alive for VPA Updater to attempt pod eviction - # minReplicas: 1 - # Specifies whether recommended updates are applied when a Pod is started and whether recommended updates - # are applied during the life of a Pod. Possible values are "Off", "Initial", "Recreate", and "Auto". - # updateMode: Auto - -# Extra manifests to deploy as an array -extraManifests: [] - # - apiVersion: v1 - # kind: ConfigMap - # metadata: - # name: prometheus-extra - # data: - # extra-data: "value" diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/Chart.yaml deleted file mode 100644 index 0773083483..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/Chart.yaml +++ /dev/null @@ -1,14 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.29.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-pushprox -apiVersion: v1 -appVersion: 0.1.0 -description: Sets up a deployment of the PushProx proxy and a DaemonSet of PushProx - clients. -name: rke2ControllerManager -type: application -version: 0.2.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/README.md deleted file mode 100644 index 345002f48a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# rancher-pushprox - -A Rancher chart based on Rancher [PushProx](https://github.com/rancher/PushProx) that sets up a Deployment of a PushProx proxy and a DaemonSet of PushProx clients on a Kubernetes cluster. - -Installs [rancher-pushprox](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-pushprox) to create PushProx clients that can access their host's network and register with a PushProx proxy. A [Prometheus Operator](https://github.com/coreos/prometheus-operator) ServiceMonitor CR is also included that is configured to scrape the metrics from each of the clients through the proxy. - -Using an instance of this chart is suitable for the following scenarios: -- You need to scrape metrics from a port that should not be accessible outside of the host (e.g. scraping `etcd` metrics in a hardened cluster) -- You need to scrape metrics on a host that are not exposed outside of 127.0.0.1 (e.g. scraping `kube-proxy` metrics) -- You need to scrape metrics through HTTPS using certs hosted directly on `hostPath` -- You need to scrape metrics from Kubernetes components that require authorization via a service account (e.g. permissions to make request to `/metrics`) -- You need to scrape metrics without access to cacerts (i.e. enable `insecureSkipVerify`) - -The clients and proxy are created based on a Rancher fork of the [prometheus-community/PushProx](https://github.com/prometheus-community/PushProx) project. - -## Upgrading to Kubernetes v1.25+ - -Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. - -As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `global.cattle.psp.enabled` set to `false` if it has been previously set to `true`. -​ -> **Note:** -> In this chart release, any previous field that was associated with any PSP resources have been removed in favor of a single global field: `global.cattle.psp.enabled`. - -> **Note:** -> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** -> -> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. - -Upon setting `global.cattle.psp.enabled` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. - -As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. - -## Configuration - -The following tables list the configurable parameters of the rancher-pushprox chart and their default values. - -### General - -#### Required -| Parameter | Description | Example | -| ----- | ----------- | ------ | -| `component` | The component that is being monitored | `kube-etcd` -| `metricsPort` | The port on the host that contains the metrics you want to scrape (e.g. `http://:/metrics`) | `2379` | -| `namespaceOverride` | The namespace to install the chart | `""` - -#### Optional -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `serviceMonitor.enabled` | Deploys a [Prometheus Operator](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor) ServiceMonitor CR that is configured to scrape metrics on the hosts that the clients are deployed on via the proxy. Also deploys a Service that points to all pods with the expected client name that exposes the `metricsPort` selected | `true` | -| `serviceMonitor.endpoints` | A list of endpoints that will be added to the ServiceMonitor based on the [Endpoint spec](https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint) | `[{port: metrics}]` | -| `service.selector` | The selector that is used to populate the Service's Endpoints object. The chart will error out on rendering templating if `.Values.clients.enabled` is set alongside this field, since it is expected that this service should point to the PushProx Clients Daemonset / Deployment | `{}` | -| `clients.enabled` | Deploys a DaemonSet of clients that are each capable of scraping endpoints on the hostNetwork it is deployed on | `true` | -| `clients.port` | The port where the client will publish PushProx client-specific metrics. If deploying multiple clients onto the same node, the clients should not have conflicting ports | `9369` | -| `clients.proxyUrl` | Overrides the default proxyUrl setting of `http://pushprox-{{ .Values.component }}-proxy.{{ . Release.Namespace }}.svc.cluster.local:{{ .Values.proxy.port }}"` with the `proxyUrl` specified | `""` | -| `clients.useLocalhost` | Sets a flag on each client deployment to redirect scrapes directed to `HOST_IP` to `127.0.0.1` | `false` | -| `clients.https.enabled` | Enables scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.forceHTTPSScheme` | Forces scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.useServiceAccountCredentials` | If set to true, the client will create a service account with permissions to scrape `/metrics` endpoint of Kubernetes components. The client will use the service account token provided to make authorized scrape requests to the Kubernetes API | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.enabled` | If set to true, the client will use service account credentials mounted at the configured path `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath`. This requires permissions to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath` | This is a volume mount on the pod with permissions to scrape `/metrics` endpoint of Kubernetes components | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | -| `clients.https.authenticationMethod.bearerTokenSecret.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.authorization.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components | `false` | -| `clients.https.authenticationMethod.authorization.type` | If set, the client will use this type of authorization in its client requests for metrics | `"bearer"` | -| `clients.https.authenticationMethod.authorization.credentials.key` | If set, the client will use this key in the secret created by `clients.https.useServiceAccountCredentials` for authorization in its client requests for metrics | `"token"` | -| `clients.https.authenticationMethod.authorization.credentials.optional` | If set to false, the client will fail if the key in the secret created by `clients.https.useServiceAccountCredentials` does not exist | `false` | -| `clients.https.insecureSkipVerify` | If set to true, the client will disable SSL security checks | `false` | -| `clients.https.certDir` | A `hostPath` where TLS certs can be found. This path is mounted as a volume on an `initContainer` which copies only the necessary files over to an EmptyDir volume used by each client. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.certFile` | The path to the TLS cert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.keyFile` | The path to the TLS key file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.caCertFile` | The path to the TLS cacert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.seLinuxOptions` | seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. | `""` | -| `clients.metrics.enabled` | Whether the client should publish PushProx client-specific metrics. | `false` | -| `clients.rbac.additionalRules` | Additional permissions to provide to the ServiceAccount bound to the client. This can be used to provide additional permissions for the client to scrape metrics from the k8s API. Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true | `[]` | -| `clients.deployment.enabled` | Deploys the client as a Deployment (generally used if the underlying hostNetwork Pod that is being scraped is managed by a Deployment) | `false` | -| `clients.deployment.replicas` | The number of pods the Deployment has, it should match the number of pod the hostNetwork Deployment has. Required and only used if `client.deployment.enable` is set | `0` | -| `clients.deployment.affinity` | The affinity rules that allocate the pod to the node in which the hostNetwork Deployment's pods run. Required and only used if `client.deployment.enable` is set | `{}` | -| `clients.resources` | Set resource limits and requests for the client container | `{}` | -| `clients.nodeSelector` | Select which nodes to deploy the clients on | `{}` | -| `clients.tolerations` | Specify tolerations for clients | `[]` | -| `proxy.enabled` | Deploys the proxy that each client will register with | `true` | -| `proxy.port` | The port exposed by the proxy that each client will register with to allow metrics to be scraped from the host | `8080` | -| `proxy.resources` | Set resource limits and requests for the proxy container | `{}` | -| `proxy.nodeSelector` | Select which nodes the proxy can be deployed on | `{}` | -| `proxy.tolerations` | Specify tolerations (if necessary) to allow the proxy to be deployed on the selected node | `[]` | -| `kubeVersionOverrides` | A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches any of the semver constraints provided as keys on the map. On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. | `[]` - -*Tip: The filepaths set in `clients.https.File` can include wildcard characters*. - -See [rancher-monitoring](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-monitoring) for examples of how this chart can be used. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/_helpers.tpl deleted file mode 100644 index 8e651dccfd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/_helpers.tpl +++ /dev/null @@ -1,166 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# General - -{{- define "applyKubeVersionOverrides" -}} -{{- $overrides := dict -}} -{{- range $override := .Values.kubeVersionOverrides -}} -{{- if semverCompare $override.constraint $.Capabilities.KubeVersion.Version -}} -{{- $_ := mergeOverwrite $overrides $override.values -}} -{{- end -}} -{{- end -}} -{{- $_ := mergeOverwrite .Values $overrides -}} -{{- end -}} - -{{- define "pushprox.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{- define "pushProxy.commonLabels" -}} -release: {{ .Release.Name }} -component: {{ .Values.component | quote }} -provider: kubernetes -{{- end -}} - -{{- define "pushProxy.proxyUrl" -}} -{{- $_ := (required "Template requires either .Values.proxy.port or .Values.client.proxyUrl to set proxyUrl for client" (or .Values.clients.proxyUrl .Values.proxy.port)) -}} -{{- if .Values.clients.proxyUrl -}} -{{ printf "%s" .Values.clients.proxyUrl }} -{{- else -}} -{{ printf "http://%s.%s.svc:%d" (include "pushProxy.proxy.name" .) (include "pushprox.namespace" .) (int .Values.proxy.port) }} -{{- end -}}{{- end -}} - -# Client - -{{- define "pushProxy.client.name" -}} -{{- printf "pushprox-%s-client" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.serviceAccountTokenName" -}} -{{- printf "pushprox-%s-client-service-account-token" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.labels" -}} -k8s-app: {{ template "pushProxy.client.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# Proxy - -{{- define "pushProxy.proxy.name" -}} -{{- printf "pushprox-%s-proxy" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.proxy.labels" -}} -k8s-app: {{ template "pushProxy.proxy.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# ServiceMonitor - -{{- define "pushprox.serviceMonitor.name" -}} -{{- printf "%s-%s" .Release.Name (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.labels" -}} -app: {{ template "pushprox.serviceMonitor.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.endpoints" -}} -{{- $proxyURL := (include "pushProxy.proxyUrl" .) -}} -{{- $useHTTPS := .Values.clients.https.enabled -}} -{{- $forceHTTPSScheme := .Values.clients.https.forceHTTPSScheme -}} -{{- $insecureSkipVerify := .Values.clients.https.insecureSkipVerify -}} -{{- $useServiceAccountCredentials := .Values.clients.https.useServiceAccountCredentials -}} -{{- $serviceAccountTokenName := (include "pushProxy.client.serviceAccountTokenName" . ) -}} -{{- $metricRelabelings := list }} -{{- $endpoints := .Values.serviceMonitor.endpoints }} -{{- range $endpoints }} -{{- if $.Values.proxy.enabled }} -{{- $_ := set . "proxyUrl" $proxyURL }} -{{- end }} -{{- $clusterIdRelabel := dict }} -{{- if $.Values.global.cattle.clusterId }} -{{- $_ := set $clusterIdRelabel "action" "replace" }} -{{- $_ := set $clusterIdRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterIdRelabel "targetLabel" "cluster_id" }} -{{- $_ := set $clusterIdRelabel "replacement" $.Values.global.cattle.clusterId }} -{{- end }} -{{- $clusterNameRelabel := dict }} -{{- if $.Values.global.cattle.clusterName }} -{{- $_ := set $clusterNameRelabel "action" "replace" }} -{{- $_ := set $clusterNameRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterNameRelabel "targetLabel" "cluster_name" }} -{{- $_ := set $clusterNameRelabel "replacement" $.Values.global.cattle.clusterName }} -{{- end }} -{{- $metricRelabelings := gt (len (keys $clusterNameRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterNameRelabel)) ($metricRelabelings) }} -{{- $metricRelabelings := gt (len (keys $clusterIdRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterIdRelabel)) ($metricRelabelings) }} -{{- if not (empty $metricRelabelings) }} -{{- $_ := set . "metricRelabelings" ($metricRelabelings)}} -{{- end }} -{{- if $forceHTTPSScheme -}} -{{- $_ := set . "scheme" "https" }} -{{- end -}} -{{- if $useHTTPS -}} -{{- if (hasKey . "params") }} -{{- $_ := set (get . "params") "_scheme" (list "https") }} -{{- else }} -{{- $_ := set . "params" (dict "_scheme" (list "https")) }} -{{- end }} -{{- end }} -{{- if (hasKey . "tlsConfig") }} -{{- $_ := set (get . "tlsConfig") "insecureSkipVerify" $insecureSkipVerify }} -{{- else }} -{{- $_ := set . "tlsConfig" (dict "insecureSkipVerify" $insecureSkipVerify) }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenFile.enabled }} -{{- $_ := set . "bearerTokenFile" $.Values.clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenSecret.enabled }} -{{- $_ := set . "bearerTokenSecret" $serviceAccountTokenName }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.authorization.enabled }} -{{- if (hasKey . "authorization") }} -{{- $_ := set (get . "authorization") "type" $.Values.clients.https.authenticationMethod.authorization.type }} -{{- $_ := set (get . "authorization") "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional) }} -{{- else }} -{{- $_ := set . "authorization" (dict "type" $.Values.clients.https.authenticationMethod.authorization.type) }} -{{- $_ := set . "authorization" (dict "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional)) }} -{{- end }} -{{- end }} -{{- end }} -{{- toYaml $endpoints }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-clients-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-clients-rbac.yaml deleted file mode 100644 index a8e27c3735..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-clients-rbac.yaml +++ /dev/null @@ -1,97 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.client.name" . }} -{{- end }} -{{- if and .Values.clients.https.enabled .Values.clients.https.useServiceAccountCredentials }} -- nonResourceURLs: ["/metrics"] - verbs: ["get"] -{{- if .Values.clients.rbac.additionalRules }} -{{ toYaml .Values.clients.rbac.additionalRules }} -{{- end }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.client.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} ---- -{{- if .Values.clients.https.useServiceAccountCredentials }} -apiVersion: v1 -kind: Secret -type: kubernetes.io/service-account-token -metadata: - name: {{ template "pushProxy.client.serviceAccountTokenName" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - annotations: - kubernetes.io/service-account.name: {{ template "pushProxy.client.name" . }} -{{- end }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: true - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 6 }} -{{- end }} - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - - 'emptyDir' - - 'hostPath' - allowedHostPaths: - - pathPrefix: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - readOnly: true -{{- end }} -{{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-clients.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-clients.yaml deleted file mode 100644 index e8fcfb3883..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-clients.yaml +++ /dev/null @@ -1,157 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: apps/v1 -{{- if .Values.clients.deployment.enabled }} -kind: Deployment -{{- else }} -kind: DaemonSet -{{- end }} -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - pushprox-exporter: "client" -spec: - {{- if .Values.clients.deployment.enabled }} - replicas: {{ .Values.clients.deployment.replicas }} - {{- end }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.client.labels" . | nindent 8 }} - spec: - {{- if .Values.clients.affinity }} - affinity: {{ toYaml .Values.clients.affinity | nindent 8 }} - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.clients.nodeSelector }} -{{ toYaml .Values.clients.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.clients.tolerations }} -{{ toYaml .Values.clients.tolerations | indent 8 }} -{{- end }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - serviceAccountName: {{ template "pushProxy.client.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-client - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - {{- range .Values.clients.command }} - - {{ . | quote }} - {{- end }} - args: - - --fqdn=$(HOST_IP) - - --proxy-url=$(PROXY_URL) - {{- if .Values.clients.metrics.enabled }} - - --metrics-addr=$(PORT) - {{- end }} - - --allow-port={{ required "Need .Values.metricsPort to configure client to be allowed to scrape metrics at port" .Values.metricsPort}} - {{- if .Values.clients.useLocalhost }} - - --use-localhost - {{- end }} - {{- if .Values.clients.https.enabled }} - {{- if .Values.clients.https.insecureSkipVerify }} - - --insecure-skip-verify - {{- end }} - {{- if .Values.clients.https.useServiceAccountCredentials }} - - --token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- end }} - {{- if .Values.clients.https.certDir }} - - --tls.cert=/etc/ssl/push-proxy/push-proxy.pem - - --tls.key=/etc/ssl/push-proxy/push-proxy-key.pem - - --tls.cacert=/etc/ssl/push-proxy/push-proxy-ca-cert.pem - {{- end }} - {{- end }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if .Values.clients.metrics.enabled }} - - name: PORT - value: :{{ .Values.clients.port }} - {{- end }} - - name: PROXY_URL - value: {{ template "pushProxy.proxyUrl" . }} - securityContext: - runAsNonRoot: true - runAsUser: 1000 - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - volumeMounts: - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - {{- end }} - {{- if .Values.clients.resources }} - resources: {{ toYaml .Values.clients.resources | nindent 10 }} - {{- end }} - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - initContainers: - - name: copy-certs - image: {{ template "system_default_registry" . }}{{ .Values.clients.copyCertsImage.repository }}:{{ .Values.clients.copyCertsImage.tag }} - command: - - sh - - -c - - | - echo "Searching for files to copy within the source volume" - echo "cert: ${CERT_FILE_NAME}" - echo "key: ${KEY_FILE_NAME}" - echo "cacert: ${CACERT_FILE_NAME}" - - CERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CERT_FILE_NAME}" | sort -r | head -n 1) - KEY_FILE_SOURCE=$(find /etc/source/ -type f -name "${KEY_FILE_NAME}" | sort -r | head -n 1) - CACERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CACERT_FILE_NAME}" | sort -r | head -n 1) - - test -z ${CERT_FILE_SOURCE} && echo "Failed to find cert file" && exit 1 - test -z ${KEY_FILE_SOURCE} && echo "Failed to find key file" && exit 1 - test -z ${CACERT_FILE_SOURCE} && echo "Failed to find cacert file" && exit 1 - - echo "Copying cert file from $CERT_FILE_SOURCE to $CERT_FILE_TARGET" - cp $CERT_FILE_SOURCE $CERT_FILE_TARGET || exit 1 - chmod 444 $CERT_FILE_TARGET || exit 1 - - echo "Copying key file from $KEY_FILE_SOURCE to $KEY_FILE_TARGET" - cp $KEY_FILE_SOURCE $KEY_FILE_TARGET || exit 1 - chmod 444 $KEY_FILE_TARGET || exit 1 - - echo "Copying cacert file from $CACERT_FILE_SOURCE to $CACERT_FILE_TARGET" - cp $CACERT_FILE_SOURCE $CACERT_FILE_TARGET || exit 1 - chmod 444 $CACERT_FILE_TARGET || exit 1 - env: - - name: CERT_FILE_NAME - value: {{ required "Need a TLS cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.certFile }} - - name: KEY_FILE_NAME - value: {{ required "Need a TLS key file for scraping metrics endpoint over HTTPs" .Values.clients.https.keyFile }} - - name: CACERT_FILE_NAME - value: {{ required "Need a TLS CA cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.caCertFile }} - - name: CERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy.pem - - name: KEY_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-key.pem - - name: CACERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-ca-cert.pem - securityContext: - runAsNonRoot: false -{{- if and .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 12 }} -{{- end }} - volumeMounts: - - name: metrics-cert-dir-source - mountPath: /etc/source - readOnly: true - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - volumes: - - name: metrics-cert-dir-source - hostPath: - path: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - - name: metrics-cert-dir - emptyDir: {} - {{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-proxy-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-proxy-rbac.yaml deleted file mode 100644 index eefe609058..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-proxy-rbac.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.proxy.name" . }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.proxy.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- end }}{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-proxy.yaml deleted file mode 100644 index 723bbd6c00..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-proxy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} - pushprox-exporter: "proxy" -spec: - selector: - matchLabels: {{ include "pushProxy.proxy.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.proxy.labels" . | nindent 8 }} - spec: - securityContext: - runAsNonRoot: true - runAsUser: 1000 - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.proxy.nodeSelector }} -{{ toYaml .Values.proxy.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.proxy.tolerations }} -{{ toYaml .Values.proxy.tolerations | indent 8 }} -{{- end }} - serviceAccountName: {{ template "pushProxy.proxy.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-proxy - image: {{ template "system_default_registry" . }}{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag }} - command: - {{- range .Values.proxy.command }} - - {{ . | quote }} - {{- end }} - {{- if .Values.proxy.resources }} - resources: {{ toYaml .Values.proxy.resources | nindent 10 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - ports: - - name: pp-proxy - port: {{ required "Need .Values.proxy.port to configure proxy" .Values.proxy.port }} - protocol: TCP - targetPort: {{ .Values.proxy.port }} - selector: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-servicemonitor.yaml deleted file mode 100644 index 67eb2216b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/pushprox-servicemonitor.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.serviceMonitor }}{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "pushprox.serviceMonitor.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.serviceMonitor.labels" . | nindent 4 }} -spec: - endpoints: {{include "pushProxy.serviceMonitor.endpoints" . | nindent 4 }} - jobLabel: component - podTargetLabels: - - component - - pushprox-exporter - namespaceSelector: - matchNames: - - {{ template "pushprox.namespace" . }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} ---- -{{- $selector := "" }} -{{- if not (kindIs "invalid" .Values.service) }} -{{- if not (kindIs "invalid" .Values.service.selector) }} -{{ if .Values.service.selector }} -{{- if .Values.clients.enabled }} -{{- required (printf "Cannot override .Values.service.selector=%s when .Values.clients.enabled=true" (toJson .Values.service.selector)) "" }} -{{- end }} -{{- $selector = (toYaml .Values.service.selector) }} -{{- end }} -{{- end }} -{{- end }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - ports: - - name: metrics - port: {{ required "Need .Values.metricsPort to configure client to listen to metrics at port" .Values.metricsPort}} - protocol: TCP - targetPort: {{ .Values.metricsPort }} - selector: {{ default (include "pushProxy.client.labels" .) $selector | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/validate-install-crd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/validate-install-crd.yaml deleted file mode 100644 index 16abc2fa83..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/validate-install-crd.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -# {{- $found := dict -}} -# {{- set $found "monitoring.coreos.com/v1/ServiceMonitor" false -}} -# {{- range .Capabilities.APIVersions -}} -# {{- if hasKey $found (toString .) -}} -# {{- set $found (toString .) true -}} -# {{- end -}} -# {{- end -}} -# {{- range $_, $exists := $found -}} -# {{- if (eq $exists false) -}} -# {{- required "Required CRDs are missing. Please install Prometheus Operator CRDs before installing this chart." "" -}} -# {{- end -}} -# {{- end -}} -#{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/validate-psp-install.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/values.yaml deleted file mode 100644 index 1e076041b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2ControllerManager/values.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# Default values for rancher-pushprox. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Default image containing both the proxy and the client was generated from the following Dockerfile -# https://github.com/prometheus-community/PushProx/blob/eeadbe766641699129920ccfaaaa30a85c67fe81/Dockerfile#L1-L15 - -# Configuration - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - seLinux: - enabled: false - -# A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. -# -# For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches -# any of the semver constraints provided as keys on the map. -# -# On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. -# -# If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. -# -# Notes: -# - On running a helm template, Helm generally assumes the kubeVersion is v1.20.0 -# - On running a helm install --dry-run, the correct kubeVersion should be chosen. -kubeVersionOverrides: [] -# - constraint: "< 1.21" -# values: -# metricsPort: 10252 -# clients: -# https: -# enabled: false -# insecureSkipVerify: false -# useServiceAccountCredentials: false - -namespaceOverride: "" - -# The component that is being monitored (i.e. etcd) -component: "component" - -# The port containing the metrics that need to be scraped -metricsPort: 2739 - -# Configure ServiceMonitor that monitors metrics from the metricsPort endpoint -serviceMonitor: - enabled: true - # A list of endpoints that will be added to the ServiceMonitor based on the Endpoint spec - # Source: https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint - # By default, proxyUrl and params._scheme will be overridden based on other values - endpoints: - - port: metrics - -# Configure Service that grabs scrape targets -service: - # The selector that is used to populate the Service's Endpoints object. - # The chart will error out on rendering templating if .Values.clients.enabled is set alongside this field, - # since it is expected that this service should point to the PushProx Clients Daemonset / Deployment - selector: {} - -clients: - enabled: true - # The port which the PushProx client will post PushProx metrics to - port: 9369 - # If unset, this will default to the URL for the proxy service: http://pushprox-{{component}}-proxy.{{namepsace}}.svc.cluster.local:{{proxy.port}} - # Should be modified if the clients are being deployed outside the cluster where the proxy rests, otherwise leave it null - proxyUrl: "" - # If set to true, the client will forward any requests from the host IP to 127.0.0.1 - # It will only allow proxy requests to the metricsPort specified - useLocalhost: false - # Configuration for accessing metrics via HTTPS - https: - # Does the client require https to access the metrics? - enabled: false - # Does the client require requests be sent to http or https? - forceHTTPSScheme: false - # If set to true, the client will create a service account with adequate permissions and set a flag - # on the client to use the service account token provided by it to make authorized scrape requests - useServiceAccountCredentials: false - # Configuration for authentication to metrics via https endpoint - authenticationMethod: - # Reads token from defined file in container - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenFile: - enabled: false - bearerTokenFilePath: "/var/run/secrets/kubernetes.io/serviceaccount/token" - # Reads token from defined secret in namespace - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenSecret: - enabled: false - # Reads token from defined secret in namespace - authorization: - enabled: false - type: "bearer" - credentials: - key: "token" - optional: false - # If set to true, the client will disable SSL security checks - insecureSkipVerify: false - # Directory on host where necessary TLS cert and key to scrape metrics can be found - certDir: "" - # Filenames for files located in .Values.clients.https.certDir that correspond to TLS settings - certFile: "" - keyFile: "" - caCertFile: "" - # seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. - # Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. - seLinuxOptions: {} - - metrics: - # Whether the client should publish PushProx client-specific metrics to .Values.clients.port - enabled: false - - rbac: - # Additional permissions to provide to the ServiceAccount bound to the client - # This can be used to provide additional permissions for the client to scrape metrics from the k8s API - # Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true - additionalRules: [] - - # Resource limits - resources: {} - - # Options to select all nodes to deploy client DaemonSet on - nodeSelector: {} - tolerations: [] - affinity: {} - - image: - repository: rancher/pushprox-client - tag: v0.1.3-rancher2-client - command: ["pushprox-client"] - - copyCertsImage: - repository: rancher/mirrored-library-busybox - tag: 1.31.1 - - # The default intention of rancher-pushprox clients is to scrape hostNetwork metrics across all nodes. - # This can be used to scrape internal Kubernetes components or DaemonSets of hostNetwork Pods in - # situations where a cloud provider firewall prevents Pod-To-Host communication but not Pod-To-Pod. - # However, if the underlying hostNetwork Pod that is being scraped is managed by a Deployment, - # this advanced option enables users to deploy the client as a Deployment instead of a DaemonSet. - # If a user deploys this feature and the underlying Deployment's number of replicas changes, the user will - # be responsible for upgrading this chart accordingly to the right number of replicas. - deployment: - enabled: false - replicas: 0 - -proxy: - enabled: true - # The port through which PushProx clients will communicate to the proxy - port: 8080 - - # Resource limits - resources: {} - - # Options to select a node to run a single proxy deployment on - nodeSelector: {} - tolerations: [] - - image: - repository: rancher/pushprox-proxy - tag: v0.1.3-rancher2-proxy - command: ["pushprox-proxy"] diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/Chart.yaml deleted file mode 100644 index ba8c64614f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/Chart.yaml +++ /dev/null @@ -1,14 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.29.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-pushprox -apiVersion: v1 -appVersion: 0.1.0 -description: Sets up a deployment of the PushProx proxy and a DaemonSet of PushProx - clients. -name: rke2Etcd -type: application -version: 0.2.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/README.md deleted file mode 100644 index 345002f48a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# rancher-pushprox - -A Rancher chart based on Rancher [PushProx](https://github.com/rancher/PushProx) that sets up a Deployment of a PushProx proxy and a DaemonSet of PushProx clients on a Kubernetes cluster. - -Installs [rancher-pushprox](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-pushprox) to create PushProx clients that can access their host's network and register with a PushProx proxy. A [Prometheus Operator](https://github.com/coreos/prometheus-operator) ServiceMonitor CR is also included that is configured to scrape the metrics from each of the clients through the proxy. - -Using an instance of this chart is suitable for the following scenarios: -- You need to scrape metrics from a port that should not be accessible outside of the host (e.g. scraping `etcd` metrics in a hardened cluster) -- You need to scrape metrics on a host that are not exposed outside of 127.0.0.1 (e.g. scraping `kube-proxy` metrics) -- You need to scrape metrics through HTTPS using certs hosted directly on `hostPath` -- You need to scrape metrics from Kubernetes components that require authorization via a service account (e.g. permissions to make request to `/metrics`) -- You need to scrape metrics without access to cacerts (i.e. enable `insecureSkipVerify`) - -The clients and proxy are created based on a Rancher fork of the [prometheus-community/PushProx](https://github.com/prometheus-community/PushProx) project. - -## Upgrading to Kubernetes v1.25+ - -Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. - -As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `global.cattle.psp.enabled` set to `false` if it has been previously set to `true`. -​ -> **Note:** -> In this chart release, any previous field that was associated with any PSP resources have been removed in favor of a single global field: `global.cattle.psp.enabled`. - -> **Note:** -> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** -> -> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. - -Upon setting `global.cattle.psp.enabled` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. - -As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. - -## Configuration - -The following tables list the configurable parameters of the rancher-pushprox chart and their default values. - -### General - -#### Required -| Parameter | Description | Example | -| ----- | ----------- | ------ | -| `component` | The component that is being monitored | `kube-etcd` -| `metricsPort` | The port on the host that contains the metrics you want to scrape (e.g. `http://:/metrics`) | `2379` | -| `namespaceOverride` | The namespace to install the chart | `""` - -#### Optional -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `serviceMonitor.enabled` | Deploys a [Prometheus Operator](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor) ServiceMonitor CR that is configured to scrape metrics on the hosts that the clients are deployed on via the proxy. Also deploys a Service that points to all pods with the expected client name that exposes the `metricsPort` selected | `true` | -| `serviceMonitor.endpoints` | A list of endpoints that will be added to the ServiceMonitor based on the [Endpoint spec](https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint) | `[{port: metrics}]` | -| `service.selector` | The selector that is used to populate the Service's Endpoints object. The chart will error out on rendering templating if `.Values.clients.enabled` is set alongside this field, since it is expected that this service should point to the PushProx Clients Daemonset / Deployment | `{}` | -| `clients.enabled` | Deploys a DaemonSet of clients that are each capable of scraping endpoints on the hostNetwork it is deployed on | `true` | -| `clients.port` | The port where the client will publish PushProx client-specific metrics. If deploying multiple clients onto the same node, the clients should not have conflicting ports | `9369` | -| `clients.proxyUrl` | Overrides the default proxyUrl setting of `http://pushprox-{{ .Values.component }}-proxy.{{ . Release.Namespace }}.svc.cluster.local:{{ .Values.proxy.port }}"` with the `proxyUrl` specified | `""` | -| `clients.useLocalhost` | Sets a flag on each client deployment to redirect scrapes directed to `HOST_IP` to `127.0.0.1` | `false` | -| `clients.https.enabled` | Enables scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.forceHTTPSScheme` | Forces scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.useServiceAccountCredentials` | If set to true, the client will create a service account with permissions to scrape `/metrics` endpoint of Kubernetes components. The client will use the service account token provided to make authorized scrape requests to the Kubernetes API | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.enabled` | If set to true, the client will use service account credentials mounted at the configured path `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath`. This requires permissions to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath` | This is a volume mount on the pod with permissions to scrape `/metrics` endpoint of Kubernetes components | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | -| `clients.https.authenticationMethod.bearerTokenSecret.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.authorization.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components | `false` | -| `clients.https.authenticationMethod.authorization.type` | If set, the client will use this type of authorization in its client requests for metrics | `"bearer"` | -| `clients.https.authenticationMethod.authorization.credentials.key` | If set, the client will use this key in the secret created by `clients.https.useServiceAccountCredentials` for authorization in its client requests for metrics | `"token"` | -| `clients.https.authenticationMethod.authorization.credentials.optional` | If set to false, the client will fail if the key in the secret created by `clients.https.useServiceAccountCredentials` does not exist | `false` | -| `clients.https.insecureSkipVerify` | If set to true, the client will disable SSL security checks | `false` | -| `clients.https.certDir` | A `hostPath` where TLS certs can be found. This path is mounted as a volume on an `initContainer` which copies only the necessary files over to an EmptyDir volume used by each client. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.certFile` | The path to the TLS cert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.keyFile` | The path to the TLS key file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.caCertFile` | The path to the TLS cacert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.seLinuxOptions` | seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. | `""` | -| `clients.metrics.enabled` | Whether the client should publish PushProx client-specific metrics. | `false` | -| `clients.rbac.additionalRules` | Additional permissions to provide to the ServiceAccount bound to the client. This can be used to provide additional permissions for the client to scrape metrics from the k8s API. Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true | `[]` | -| `clients.deployment.enabled` | Deploys the client as a Deployment (generally used if the underlying hostNetwork Pod that is being scraped is managed by a Deployment) | `false` | -| `clients.deployment.replicas` | The number of pods the Deployment has, it should match the number of pod the hostNetwork Deployment has. Required and only used if `client.deployment.enable` is set | `0` | -| `clients.deployment.affinity` | The affinity rules that allocate the pod to the node in which the hostNetwork Deployment's pods run. Required and only used if `client.deployment.enable` is set | `{}` | -| `clients.resources` | Set resource limits and requests for the client container | `{}` | -| `clients.nodeSelector` | Select which nodes to deploy the clients on | `{}` | -| `clients.tolerations` | Specify tolerations for clients | `[]` | -| `proxy.enabled` | Deploys the proxy that each client will register with | `true` | -| `proxy.port` | The port exposed by the proxy that each client will register with to allow metrics to be scraped from the host | `8080` | -| `proxy.resources` | Set resource limits and requests for the proxy container | `{}` | -| `proxy.nodeSelector` | Select which nodes the proxy can be deployed on | `{}` | -| `proxy.tolerations` | Specify tolerations (if necessary) to allow the proxy to be deployed on the selected node | `[]` | -| `kubeVersionOverrides` | A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches any of the semver constraints provided as keys on the map. On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. | `[]` - -*Tip: The filepaths set in `clients.https.File` can include wildcard characters*. - -See [rancher-monitoring](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-monitoring) for examples of how this chart can be used. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/_helpers.tpl deleted file mode 100644 index 8e651dccfd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/_helpers.tpl +++ /dev/null @@ -1,166 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# General - -{{- define "applyKubeVersionOverrides" -}} -{{- $overrides := dict -}} -{{- range $override := .Values.kubeVersionOverrides -}} -{{- if semverCompare $override.constraint $.Capabilities.KubeVersion.Version -}} -{{- $_ := mergeOverwrite $overrides $override.values -}} -{{- end -}} -{{- end -}} -{{- $_ := mergeOverwrite .Values $overrides -}} -{{- end -}} - -{{- define "pushprox.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{- define "pushProxy.commonLabels" -}} -release: {{ .Release.Name }} -component: {{ .Values.component | quote }} -provider: kubernetes -{{- end -}} - -{{- define "pushProxy.proxyUrl" -}} -{{- $_ := (required "Template requires either .Values.proxy.port or .Values.client.proxyUrl to set proxyUrl for client" (or .Values.clients.proxyUrl .Values.proxy.port)) -}} -{{- if .Values.clients.proxyUrl -}} -{{ printf "%s" .Values.clients.proxyUrl }} -{{- else -}} -{{ printf "http://%s.%s.svc:%d" (include "pushProxy.proxy.name" .) (include "pushprox.namespace" .) (int .Values.proxy.port) }} -{{- end -}}{{- end -}} - -# Client - -{{- define "pushProxy.client.name" -}} -{{- printf "pushprox-%s-client" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.serviceAccountTokenName" -}} -{{- printf "pushprox-%s-client-service-account-token" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.labels" -}} -k8s-app: {{ template "pushProxy.client.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# Proxy - -{{- define "pushProxy.proxy.name" -}} -{{- printf "pushprox-%s-proxy" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.proxy.labels" -}} -k8s-app: {{ template "pushProxy.proxy.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# ServiceMonitor - -{{- define "pushprox.serviceMonitor.name" -}} -{{- printf "%s-%s" .Release.Name (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.labels" -}} -app: {{ template "pushprox.serviceMonitor.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.endpoints" -}} -{{- $proxyURL := (include "pushProxy.proxyUrl" .) -}} -{{- $useHTTPS := .Values.clients.https.enabled -}} -{{- $forceHTTPSScheme := .Values.clients.https.forceHTTPSScheme -}} -{{- $insecureSkipVerify := .Values.clients.https.insecureSkipVerify -}} -{{- $useServiceAccountCredentials := .Values.clients.https.useServiceAccountCredentials -}} -{{- $serviceAccountTokenName := (include "pushProxy.client.serviceAccountTokenName" . ) -}} -{{- $metricRelabelings := list }} -{{- $endpoints := .Values.serviceMonitor.endpoints }} -{{- range $endpoints }} -{{- if $.Values.proxy.enabled }} -{{- $_ := set . "proxyUrl" $proxyURL }} -{{- end }} -{{- $clusterIdRelabel := dict }} -{{- if $.Values.global.cattle.clusterId }} -{{- $_ := set $clusterIdRelabel "action" "replace" }} -{{- $_ := set $clusterIdRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterIdRelabel "targetLabel" "cluster_id" }} -{{- $_ := set $clusterIdRelabel "replacement" $.Values.global.cattle.clusterId }} -{{- end }} -{{- $clusterNameRelabel := dict }} -{{- if $.Values.global.cattle.clusterName }} -{{- $_ := set $clusterNameRelabel "action" "replace" }} -{{- $_ := set $clusterNameRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterNameRelabel "targetLabel" "cluster_name" }} -{{- $_ := set $clusterNameRelabel "replacement" $.Values.global.cattle.clusterName }} -{{- end }} -{{- $metricRelabelings := gt (len (keys $clusterNameRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterNameRelabel)) ($metricRelabelings) }} -{{- $metricRelabelings := gt (len (keys $clusterIdRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterIdRelabel)) ($metricRelabelings) }} -{{- if not (empty $metricRelabelings) }} -{{- $_ := set . "metricRelabelings" ($metricRelabelings)}} -{{- end }} -{{- if $forceHTTPSScheme -}} -{{- $_ := set . "scheme" "https" }} -{{- end -}} -{{- if $useHTTPS -}} -{{- if (hasKey . "params") }} -{{- $_ := set (get . "params") "_scheme" (list "https") }} -{{- else }} -{{- $_ := set . "params" (dict "_scheme" (list "https")) }} -{{- end }} -{{- end }} -{{- if (hasKey . "tlsConfig") }} -{{- $_ := set (get . "tlsConfig") "insecureSkipVerify" $insecureSkipVerify }} -{{- else }} -{{- $_ := set . "tlsConfig" (dict "insecureSkipVerify" $insecureSkipVerify) }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenFile.enabled }} -{{- $_ := set . "bearerTokenFile" $.Values.clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenSecret.enabled }} -{{- $_ := set . "bearerTokenSecret" $serviceAccountTokenName }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.authorization.enabled }} -{{- if (hasKey . "authorization") }} -{{- $_ := set (get . "authorization") "type" $.Values.clients.https.authenticationMethod.authorization.type }} -{{- $_ := set (get . "authorization") "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional) }} -{{- else }} -{{- $_ := set . "authorization" (dict "type" $.Values.clients.https.authenticationMethod.authorization.type) }} -{{- $_ := set . "authorization" (dict "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional)) }} -{{- end }} -{{- end }} -{{- end }} -{{- toYaml $endpoints }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-clients-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-clients-rbac.yaml deleted file mode 100644 index a8e27c3735..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-clients-rbac.yaml +++ /dev/null @@ -1,97 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.client.name" . }} -{{- end }} -{{- if and .Values.clients.https.enabled .Values.clients.https.useServiceAccountCredentials }} -- nonResourceURLs: ["/metrics"] - verbs: ["get"] -{{- if .Values.clients.rbac.additionalRules }} -{{ toYaml .Values.clients.rbac.additionalRules }} -{{- end }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.client.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} ---- -{{- if .Values.clients.https.useServiceAccountCredentials }} -apiVersion: v1 -kind: Secret -type: kubernetes.io/service-account-token -metadata: - name: {{ template "pushProxy.client.serviceAccountTokenName" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - annotations: - kubernetes.io/service-account.name: {{ template "pushProxy.client.name" . }} -{{- end }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: true - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 6 }} -{{- end }} - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - - 'emptyDir' - - 'hostPath' - allowedHostPaths: - - pathPrefix: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - readOnly: true -{{- end }} -{{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-clients.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-clients.yaml deleted file mode 100644 index e8fcfb3883..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-clients.yaml +++ /dev/null @@ -1,157 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: apps/v1 -{{- if .Values.clients.deployment.enabled }} -kind: Deployment -{{- else }} -kind: DaemonSet -{{- end }} -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - pushprox-exporter: "client" -spec: - {{- if .Values.clients.deployment.enabled }} - replicas: {{ .Values.clients.deployment.replicas }} - {{- end }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.client.labels" . | nindent 8 }} - spec: - {{- if .Values.clients.affinity }} - affinity: {{ toYaml .Values.clients.affinity | nindent 8 }} - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.clients.nodeSelector }} -{{ toYaml .Values.clients.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.clients.tolerations }} -{{ toYaml .Values.clients.tolerations | indent 8 }} -{{- end }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - serviceAccountName: {{ template "pushProxy.client.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-client - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - {{- range .Values.clients.command }} - - {{ . | quote }} - {{- end }} - args: - - --fqdn=$(HOST_IP) - - --proxy-url=$(PROXY_URL) - {{- if .Values.clients.metrics.enabled }} - - --metrics-addr=$(PORT) - {{- end }} - - --allow-port={{ required "Need .Values.metricsPort to configure client to be allowed to scrape metrics at port" .Values.metricsPort}} - {{- if .Values.clients.useLocalhost }} - - --use-localhost - {{- end }} - {{- if .Values.clients.https.enabled }} - {{- if .Values.clients.https.insecureSkipVerify }} - - --insecure-skip-verify - {{- end }} - {{- if .Values.clients.https.useServiceAccountCredentials }} - - --token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- end }} - {{- if .Values.clients.https.certDir }} - - --tls.cert=/etc/ssl/push-proxy/push-proxy.pem - - --tls.key=/etc/ssl/push-proxy/push-proxy-key.pem - - --tls.cacert=/etc/ssl/push-proxy/push-proxy-ca-cert.pem - {{- end }} - {{- end }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if .Values.clients.metrics.enabled }} - - name: PORT - value: :{{ .Values.clients.port }} - {{- end }} - - name: PROXY_URL - value: {{ template "pushProxy.proxyUrl" . }} - securityContext: - runAsNonRoot: true - runAsUser: 1000 - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - volumeMounts: - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - {{- end }} - {{- if .Values.clients.resources }} - resources: {{ toYaml .Values.clients.resources | nindent 10 }} - {{- end }} - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - initContainers: - - name: copy-certs - image: {{ template "system_default_registry" . }}{{ .Values.clients.copyCertsImage.repository }}:{{ .Values.clients.copyCertsImage.tag }} - command: - - sh - - -c - - | - echo "Searching for files to copy within the source volume" - echo "cert: ${CERT_FILE_NAME}" - echo "key: ${KEY_FILE_NAME}" - echo "cacert: ${CACERT_FILE_NAME}" - - CERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CERT_FILE_NAME}" | sort -r | head -n 1) - KEY_FILE_SOURCE=$(find /etc/source/ -type f -name "${KEY_FILE_NAME}" | sort -r | head -n 1) - CACERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CACERT_FILE_NAME}" | sort -r | head -n 1) - - test -z ${CERT_FILE_SOURCE} && echo "Failed to find cert file" && exit 1 - test -z ${KEY_FILE_SOURCE} && echo "Failed to find key file" && exit 1 - test -z ${CACERT_FILE_SOURCE} && echo "Failed to find cacert file" && exit 1 - - echo "Copying cert file from $CERT_FILE_SOURCE to $CERT_FILE_TARGET" - cp $CERT_FILE_SOURCE $CERT_FILE_TARGET || exit 1 - chmod 444 $CERT_FILE_TARGET || exit 1 - - echo "Copying key file from $KEY_FILE_SOURCE to $KEY_FILE_TARGET" - cp $KEY_FILE_SOURCE $KEY_FILE_TARGET || exit 1 - chmod 444 $KEY_FILE_TARGET || exit 1 - - echo "Copying cacert file from $CACERT_FILE_SOURCE to $CACERT_FILE_TARGET" - cp $CACERT_FILE_SOURCE $CACERT_FILE_TARGET || exit 1 - chmod 444 $CACERT_FILE_TARGET || exit 1 - env: - - name: CERT_FILE_NAME - value: {{ required "Need a TLS cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.certFile }} - - name: KEY_FILE_NAME - value: {{ required "Need a TLS key file for scraping metrics endpoint over HTTPs" .Values.clients.https.keyFile }} - - name: CACERT_FILE_NAME - value: {{ required "Need a TLS CA cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.caCertFile }} - - name: CERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy.pem - - name: KEY_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-key.pem - - name: CACERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-ca-cert.pem - securityContext: - runAsNonRoot: false -{{- if and .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 12 }} -{{- end }} - volumeMounts: - - name: metrics-cert-dir-source - mountPath: /etc/source - readOnly: true - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - volumes: - - name: metrics-cert-dir-source - hostPath: - path: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - - name: metrics-cert-dir - emptyDir: {} - {{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-proxy-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-proxy-rbac.yaml deleted file mode 100644 index eefe609058..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-proxy-rbac.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.proxy.name" . }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.proxy.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- end }}{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-proxy.yaml deleted file mode 100644 index 723bbd6c00..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-proxy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} - pushprox-exporter: "proxy" -spec: - selector: - matchLabels: {{ include "pushProxy.proxy.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.proxy.labels" . | nindent 8 }} - spec: - securityContext: - runAsNonRoot: true - runAsUser: 1000 - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.proxy.nodeSelector }} -{{ toYaml .Values.proxy.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.proxy.tolerations }} -{{ toYaml .Values.proxy.tolerations | indent 8 }} -{{- end }} - serviceAccountName: {{ template "pushProxy.proxy.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-proxy - image: {{ template "system_default_registry" . }}{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag }} - command: - {{- range .Values.proxy.command }} - - {{ . | quote }} - {{- end }} - {{- if .Values.proxy.resources }} - resources: {{ toYaml .Values.proxy.resources | nindent 10 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - ports: - - name: pp-proxy - port: {{ required "Need .Values.proxy.port to configure proxy" .Values.proxy.port }} - protocol: TCP - targetPort: {{ .Values.proxy.port }} - selector: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-servicemonitor.yaml deleted file mode 100644 index 67eb2216b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/pushprox-servicemonitor.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.serviceMonitor }}{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "pushprox.serviceMonitor.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.serviceMonitor.labels" . | nindent 4 }} -spec: - endpoints: {{include "pushProxy.serviceMonitor.endpoints" . | nindent 4 }} - jobLabel: component - podTargetLabels: - - component - - pushprox-exporter - namespaceSelector: - matchNames: - - {{ template "pushprox.namespace" . }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} ---- -{{- $selector := "" }} -{{- if not (kindIs "invalid" .Values.service) }} -{{- if not (kindIs "invalid" .Values.service.selector) }} -{{ if .Values.service.selector }} -{{- if .Values.clients.enabled }} -{{- required (printf "Cannot override .Values.service.selector=%s when .Values.clients.enabled=true" (toJson .Values.service.selector)) "" }} -{{- end }} -{{- $selector = (toYaml .Values.service.selector) }} -{{- end }} -{{- end }} -{{- end }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - ports: - - name: metrics - port: {{ required "Need .Values.metricsPort to configure client to listen to metrics at port" .Values.metricsPort}} - protocol: TCP - targetPort: {{ .Values.metricsPort }} - selector: {{ default (include "pushProxy.client.labels" .) $selector | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/validate-install-crd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/validate-install-crd.yaml deleted file mode 100644 index 16abc2fa83..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/validate-install-crd.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -# {{- $found := dict -}} -# {{- set $found "monitoring.coreos.com/v1/ServiceMonitor" false -}} -# {{- range .Capabilities.APIVersions -}} -# {{- if hasKey $found (toString .) -}} -# {{- set $found (toString .) true -}} -# {{- end -}} -# {{- end -}} -# {{- range $_, $exists := $found -}} -# {{- if (eq $exists false) -}} -# {{- required "Required CRDs are missing. Please install Prometheus Operator CRDs before installing this chart." "" -}} -# {{- end -}} -# {{- end -}} -#{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/validate-psp-install.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/values.yaml deleted file mode 100644 index 1e076041b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Etcd/values.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# Default values for rancher-pushprox. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Default image containing both the proxy and the client was generated from the following Dockerfile -# https://github.com/prometheus-community/PushProx/blob/eeadbe766641699129920ccfaaaa30a85c67fe81/Dockerfile#L1-L15 - -# Configuration - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - seLinux: - enabled: false - -# A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. -# -# For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches -# any of the semver constraints provided as keys on the map. -# -# On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. -# -# If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. -# -# Notes: -# - On running a helm template, Helm generally assumes the kubeVersion is v1.20.0 -# - On running a helm install --dry-run, the correct kubeVersion should be chosen. -kubeVersionOverrides: [] -# - constraint: "< 1.21" -# values: -# metricsPort: 10252 -# clients: -# https: -# enabled: false -# insecureSkipVerify: false -# useServiceAccountCredentials: false - -namespaceOverride: "" - -# The component that is being monitored (i.e. etcd) -component: "component" - -# The port containing the metrics that need to be scraped -metricsPort: 2739 - -# Configure ServiceMonitor that monitors metrics from the metricsPort endpoint -serviceMonitor: - enabled: true - # A list of endpoints that will be added to the ServiceMonitor based on the Endpoint spec - # Source: https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint - # By default, proxyUrl and params._scheme will be overridden based on other values - endpoints: - - port: metrics - -# Configure Service that grabs scrape targets -service: - # The selector that is used to populate the Service's Endpoints object. - # The chart will error out on rendering templating if .Values.clients.enabled is set alongside this field, - # since it is expected that this service should point to the PushProx Clients Daemonset / Deployment - selector: {} - -clients: - enabled: true - # The port which the PushProx client will post PushProx metrics to - port: 9369 - # If unset, this will default to the URL for the proxy service: http://pushprox-{{component}}-proxy.{{namepsace}}.svc.cluster.local:{{proxy.port}} - # Should be modified if the clients are being deployed outside the cluster where the proxy rests, otherwise leave it null - proxyUrl: "" - # If set to true, the client will forward any requests from the host IP to 127.0.0.1 - # It will only allow proxy requests to the metricsPort specified - useLocalhost: false - # Configuration for accessing metrics via HTTPS - https: - # Does the client require https to access the metrics? - enabled: false - # Does the client require requests be sent to http or https? - forceHTTPSScheme: false - # If set to true, the client will create a service account with adequate permissions and set a flag - # on the client to use the service account token provided by it to make authorized scrape requests - useServiceAccountCredentials: false - # Configuration for authentication to metrics via https endpoint - authenticationMethod: - # Reads token from defined file in container - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenFile: - enabled: false - bearerTokenFilePath: "/var/run/secrets/kubernetes.io/serviceaccount/token" - # Reads token from defined secret in namespace - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenSecret: - enabled: false - # Reads token from defined secret in namespace - authorization: - enabled: false - type: "bearer" - credentials: - key: "token" - optional: false - # If set to true, the client will disable SSL security checks - insecureSkipVerify: false - # Directory on host where necessary TLS cert and key to scrape metrics can be found - certDir: "" - # Filenames for files located in .Values.clients.https.certDir that correspond to TLS settings - certFile: "" - keyFile: "" - caCertFile: "" - # seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. - # Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. - seLinuxOptions: {} - - metrics: - # Whether the client should publish PushProx client-specific metrics to .Values.clients.port - enabled: false - - rbac: - # Additional permissions to provide to the ServiceAccount bound to the client - # This can be used to provide additional permissions for the client to scrape metrics from the k8s API - # Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true - additionalRules: [] - - # Resource limits - resources: {} - - # Options to select all nodes to deploy client DaemonSet on - nodeSelector: {} - tolerations: [] - affinity: {} - - image: - repository: rancher/pushprox-client - tag: v0.1.3-rancher2-client - command: ["pushprox-client"] - - copyCertsImage: - repository: rancher/mirrored-library-busybox - tag: 1.31.1 - - # The default intention of rancher-pushprox clients is to scrape hostNetwork metrics across all nodes. - # This can be used to scrape internal Kubernetes components or DaemonSets of hostNetwork Pods in - # situations where a cloud provider firewall prevents Pod-To-Host communication but not Pod-To-Pod. - # However, if the underlying hostNetwork Pod that is being scraped is managed by a Deployment, - # this advanced option enables users to deploy the client as a Deployment instead of a DaemonSet. - # If a user deploys this feature and the underlying Deployment's number of replicas changes, the user will - # be responsible for upgrading this chart accordingly to the right number of replicas. - deployment: - enabled: false - replicas: 0 - -proxy: - enabled: true - # The port through which PushProx clients will communicate to the proxy - port: 8080 - - # Resource limits - resources: {} - - # Options to select a node to run a single proxy deployment on - nodeSelector: {} - tolerations: [] - - image: - repository: rancher/pushprox-proxy - tag: v0.1.3-rancher2-proxy - command: ["pushprox-proxy"] diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/Chart.yaml deleted file mode 100644 index a3f2bbc08d..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/Chart.yaml +++ /dev/null @@ -1,14 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.29.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-pushprox -apiVersion: v1 -appVersion: 0.1.0 -description: Sets up a deployment of the PushProx proxy and a DaemonSet of PushProx - clients. -name: rke2IngressNginx -type: application -version: 0.2.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/README.md deleted file mode 100644 index 345002f48a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# rancher-pushprox - -A Rancher chart based on Rancher [PushProx](https://github.com/rancher/PushProx) that sets up a Deployment of a PushProx proxy and a DaemonSet of PushProx clients on a Kubernetes cluster. - -Installs [rancher-pushprox](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-pushprox) to create PushProx clients that can access their host's network and register with a PushProx proxy. A [Prometheus Operator](https://github.com/coreos/prometheus-operator) ServiceMonitor CR is also included that is configured to scrape the metrics from each of the clients through the proxy. - -Using an instance of this chart is suitable for the following scenarios: -- You need to scrape metrics from a port that should not be accessible outside of the host (e.g. scraping `etcd` metrics in a hardened cluster) -- You need to scrape metrics on a host that are not exposed outside of 127.0.0.1 (e.g. scraping `kube-proxy` metrics) -- You need to scrape metrics through HTTPS using certs hosted directly on `hostPath` -- You need to scrape metrics from Kubernetes components that require authorization via a service account (e.g. permissions to make request to `/metrics`) -- You need to scrape metrics without access to cacerts (i.e. enable `insecureSkipVerify`) - -The clients and proxy are created based on a Rancher fork of the [prometheus-community/PushProx](https://github.com/prometheus-community/PushProx) project. - -## Upgrading to Kubernetes v1.25+ - -Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. - -As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `global.cattle.psp.enabled` set to `false` if it has been previously set to `true`. -​ -> **Note:** -> In this chart release, any previous field that was associated with any PSP resources have been removed in favor of a single global field: `global.cattle.psp.enabled`. - -> **Note:** -> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** -> -> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. - -Upon setting `global.cattle.psp.enabled` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. - -As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. - -## Configuration - -The following tables list the configurable parameters of the rancher-pushprox chart and their default values. - -### General - -#### Required -| Parameter | Description | Example | -| ----- | ----------- | ------ | -| `component` | The component that is being monitored | `kube-etcd` -| `metricsPort` | The port on the host that contains the metrics you want to scrape (e.g. `http://:/metrics`) | `2379` | -| `namespaceOverride` | The namespace to install the chart | `""` - -#### Optional -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `serviceMonitor.enabled` | Deploys a [Prometheus Operator](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor) ServiceMonitor CR that is configured to scrape metrics on the hosts that the clients are deployed on via the proxy. Also deploys a Service that points to all pods with the expected client name that exposes the `metricsPort` selected | `true` | -| `serviceMonitor.endpoints` | A list of endpoints that will be added to the ServiceMonitor based on the [Endpoint spec](https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint) | `[{port: metrics}]` | -| `service.selector` | The selector that is used to populate the Service's Endpoints object. The chart will error out on rendering templating if `.Values.clients.enabled` is set alongside this field, since it is expected that this service should point to the PushProx Clients Daemonset / Deployment | `{}` | -| `clients.enabled` | Deploys a DaemonSet of clients that are each capable of scraping endpoints on the hostNetwork it is deployed on | `true` | -| `clients.port` | The port where the client will publish PushProx client-specific metrics. If deploying multiple clients onto the same node, the clients should not have conflicting ports | `9369` | -| `clients.proxyUrl` | Overrides the default proxyUrl setting of `http://pushprox-{{ .Values.component }}-proxy.{{ . Release.Namespace }}.svc.cluster.local:{{ .Values.proxy.port }}"` with the `proxyUrl` specified | `""` | -| `clients.useLocalhost` | Sets a flag on each client deployment to redirect scrapes directed to `HOST_IP` to `127.0.0.1` | `false` | -| `clients.https.enabled` | Enables scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.forceHTTPSScheme` | Forces scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.useServiceAccountCredentials` | If set to true, the client will create a service account with permissions to scrape `/metrics` endpoint of Kubernetes components. The client will use the service account token provided to make authorized scrape requests to the Kubernetes API | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.enabled` | If set to true, the client will use service account credentials mounted at the configured path `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath`. This requires permissions to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath` | This is a volume mount on the pod with permissions to scrape `/metrics` endpoint of Kubernetes components | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | -| `clients.https.authenticationMethod.bearerTokenSecret.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.authorization.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components | `false` | -| `clients.https.authenticationMethod.authorization.type` | If set, the client will use this type of authorization in its client requests for metrics | `"bearer"` | -| `clients.https.authenticationMethod.authorization.credentials.key` | If set, the client will use this key in the secret created by `clients.https.useServiceAccountCredentials` for authorization in its client requests for metrics | `"token"` | -| `clients.https.authenticationMethod.authorization.credentials.optional` | If set to false, the client will fail if the key in the secret created by `clients.https.useServiceAccountCredentials` does not exist | `false` | -| `clients.https.insecureSkipVerify` | If set to true, the client will disable SSL security checks | `false` | -| `clients.https.certDir` | A `hostPath` where TLS certs can be found. This path is mounted as a volume on an `initContainer` which copies only the necessary files over to an EmptyDir volume used by each client. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.certFile` | The path to the TLS cert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.keyFile` | The path to the TLS key file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.caCertFile` | The path to the TLS cacert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.seLinuxOptions` | seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. | `""` | -| `clients.metrics.enabled` | Whether the client should publish PushProx client-specific metrics. | `false` | -| `clients.rbac.additionalRules` | Additional permissions to provide to the ServiceAccount bound to the client. This can be used to provide additional permissions for the client to scrape metrics from the k8s API. Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true | `[]` | -| `clients.deployment.enabled` | Deploys the client as a Deployment (generally used if the underlying hostNetwork Pod that is being scraped is managed by a Deployment) | `false` | -| `clients.deployment.replicas` | The number of pods the Deployment has, it should match the number of pod the hostNetwork Deployment has. Required and only used if `client.deployment.enable` is set | `0` | -| `clients.deployment.affinity` | The affinity rules that allocate the pod to the node in which the hostNetwork Deployment's pods run. Required and only used if `client.deployment.enable` is set | `{}` | -| `clients.resources` | Set resource limits and requests for the client container | `{}` | -| `clients.nodeSelector` | Select which nodes to deploy the clients on | `{}` | -| `clients.tolerations` | Specify tolerations for clients | `[]` | -| `proxy.enabled` | Deploys the proxy that each client will register with | `true` | -| `proxy.port` | The port exposed by the proxy that each client will register with to allow metrics to be scraped from the host | `8080` | -| `proxy.resources` | Set resource limits and requests for the proxy container | `{}` | -| `proxy.nodeSelector` | Select which nodes the proxy can be deployed on | `{}` | -| `proxy.tolerations` | Specify tolerations (if necessary) to allow the proxy to be deployed on the selected node | `[]` | -| `kubeVersionOverrides` | A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches any of the semver constraints provided as keys on the map. On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. | `[]` - -*Tip: The filepaths set in `clients.https.File` can include wildcard characters*. - -See [rancher-monitoring](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-monitoring) for examples of how this chart can be used. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/_helpers.tpl deleted file mode 100644 index 8e651dccfd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/_helpers.tpl +++ /dev/null @@ -1,166 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# General - -{{- define "applyKubeVersionOverrides" -}} -{{- $overrides := dict -}} -{{- range $override := .Values.kubeVersionOverrides -}} -{{- if semverCompare $override.constraint $.Capabilities.KubeVersion.Version -}} -{{- $_ := mergeOverwrite $overrides $override.values -}} -{{- end -}} -{{- end -}} -{{- $_ := mergeOverwrite .Values $overrides -}} -{{- end -}} - -{{- define "pushprox.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{- define "pushProxy.commonLabels" -}} -release: {{ .Release.Name }} -component: {{ .Values.component | quote }} -provider: kubernetes -{{- end -}} - -{{- define "pushProxy.proxyUrl" -}} -{{- $_ := (required "Template requires either .Values.proxy.port or .Values.client.proxyUrl to set proxyUrl for client" (or .Values.clients.proxyUrl .Values.proxy.port)) -}} -{{- if .Values.clients.proxyUrl -}} -{{ printf "%s" .Values.clients.proxyUrl }} -{{- else -}} -{{ printf "http://%s.%s.svc:%d" (include "pushProxy.proxy.name" .) (include "pushprox.namespace" .) (int .Values.proxy.port) }} -{{- end -}}{{- end -}} - -# Client - -{{- define "pushProxy.client.name" -}} -{{- printf "pushprox-%s-client" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.serviceAccountTokenName" -}} -{{- printf "pushprox-%s-client-service-account-token" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.labels" -}} -k8s-app: {{ template "pushProxy.client.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# Proxy - -{{- define "pushProxy.proxy.name" -}} -{{- printf "pushprox-%s-proxy" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.proxy.labels" -}} -k8s-app: {{ template "pushProxy.proxy.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# ServiceMonitor - -{{- define "pushprox.serviceMonitor.name" -}} -{{- printf "%s-%s" .Release.Name (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.labels" -}} -app: {{ template "pushprox.serviceMonitor.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.endpoints" -}} -{{- $proxyURL := (include "pushProxy.proxyUrl" .) -}} -{{- $useHTTPS := .Values.clients.https.enabled -}} -{{- $forceHTTPSScheme := .Values.clients.https.forceHTTPSScheme -}} -{{- $insecureSkipVerify := .Values.clients.https.insecureSkipVerify -}} -{{- $useServiceAccountCredentials := .Values.clients.https.useServiceAccountCredentials -}} -{{- $serviceAccountTokenName := (include "pushProxy.client.serviceAccountTokenName" . ) -}} -{{- $metricRelabelings := list }} -{{- $endpoints := .Values.serviceMonitor.endpoints }} -{{- range $endpoints }} -{{- if $.Values.proxy.enabled }} -{{- $_ := set . "proxyUrl" $proxyURL }} -{{- end }} -{{- $clusterIdRelabel := dict }} -{{- if $.Values.global.cattle.clusterId }} -{{- $_ := set $clusterIdRelabel "action" "replace" }} -{{- $_ := set $clusterIdRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterIdRelabel "targetLabel" "cluster_id" }} -{{- $_ := set $clusterIdRelabel "replacement" $.Values.global.cattle.clusterId }} -{{- end }} -{{- $clusterNameRelabel := dict }} -{{- if $.Values.global.cattle.clusterName }} -{{- $_ := set $clusterNameRelabel "action" "replace" }} -{{- $_ := set $clusterNameRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterNameRelabel "targetLabel" "cluster_name" }} -{{- $_ := set $clusterNameRelabel "replacement" $.Values.global.cattle.clusterName }} -{{- end }} -{{- $metricRelabelings := gt (len (keys $clusterNameRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterNameRelabel)) ($metricRelabelings) }} -{{- $metricRelabelings := gt (len (keys $clusterIdRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterIdRelabel)) ($metricRelabelings) }} -{{- if not (empty $metricRelabelings) }} -{{- $_ := set . "metricRelabelings" ($metricRelabelings)}} -{{- end }} -{{- if $forceHTTPSScheme -}} -{{- $_ := set . "scheme" "https" }} -{{- end -}} -{{- if $useHTTPS -}} -{{- if (hasKey . "params") }} -{{- $_ := set (get . "params") "_scheme" (list "https") }} -{{- else }} -{{- $_ := set . "params" (dict "_scheme" (list "https")) }} -{{- end }} -{{- end }} -{{- if (hasKey . "tlsConfig") }} -{{- $_ := set (get . "tlsConfig") "insecureSkipVerify" $insecureSkipVerify }} -{{- else }} -{{- $_ := set . "tlsConfig" (dict "insecureSkipVerify" $insecureSkipVerify) }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenFile.enabled }} -{{- $_ := set . "bearerTokenFile" $.Values.clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenSecret.enabled }} -{{- $_ := set . "bearerTokenSecret" $serviceAccountTokenName }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.authorization.enabled }} -{{- if (hasKey . "authorization") }} -{{- $_ := set (get . "authorization") "type" $.Values.clients.https.authenticationMethod.authorization.type }} -{{- $_ := set (get . "authorization") "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional) }} -{{- else }} -{{- $_ := set . "authorization" (dict "type" $.Values.clients.https.authenticationMethod.authorization.type) }} -{{- $_ := set . "authorization" (dict "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional)) }} -{{- end }} -{{- end }} -{{- end }} -{{- toYaml $endpoints }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-clients-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-clients-rbac.yaml deleted file mode 100644 index a8e27c3735..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-clients-rbac.yaml +++ /dev/null @@ -1,97 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.client.name" . }} -{{- end }} -{{- if and .Values.clients.https.enabled .Values.clients.https.useServiceAccountCredentials }} -- nonResourceURLs: ["/metrics"] - verbs: ["get"] -{{- if .Values.clients.rbac.additionalRules }} -{{ toYaml .Values.clients.rbac.additionalRules }} -{{- end }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.client.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} ---- -{{- if .Values.clients.https.useServiceAccountCredentials }} -apiVersion: v1 -kind: Secret -type: kubernetes.io/service-account-token -metadata: - name: {{ template "pushProxy.client.serviceAccountTokenName" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - annotations: - kubernetes.io/service-account.name: {{ template "pushProxy.client.name" . }} -{{- end }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: true - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 6 }} -{{- end }} - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - - 'emptyDir' - - 'hostPath' - allowedHostPaths: - - pathPrefix: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - readOnly: true -{{- end }} -{{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-clients.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-clients.yaml deleted file mode 100644 index e8fcfb3883..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-clients.yaml +++ /dev/null @@ -1,157 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: apps/v1 -{{- if .Values.clients.deployment.enabled }} -kind: Deployment -{{- else }} -kind: DaemonSet -{{- end }} -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - pushprox-exporter: "client" -spec: - {{- if .Values.clients.deployment.enabled }} - replicas: {{ .Values.clients.deployment.replicas }} - {{- end }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.client.labels" . | nindent 8 }} - spec: - {{- if .Values.clients.affinity }} - affinity: {{ toYaml .Values.clients.affinity | nindent 8 }} - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.clients.nodeSelector }} -{{ toYaml .Values.clients.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.clients.tolerations }} -{{ toYaml .Values.clients.tolerations | indent 8 }} -{{- end }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - serviceAccountName: {{ template "pushProxy.client.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-client - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - {{- range .Values.clients.command }} - - {{ . | quote }} - {{- end }} - args: - - --fqdn=$(HOST_IP) - - --proxy-url=$(PROXY_URL) - {{- if .Values.clients.metrics.enabled }} - - --metrics-addr=$(PORT) - {{- end }} - - --allow-port={{ required "Need .Values.metricsPort to configure client to be allowed to scrape metrics at port" .Values.metricsPort}} - {{- if .Values.clients.useLocalhost }} - - --use-localhost - {{- end }} - {{- if .Values.clients.https.enabled }} - {{- if .Values.clients.https.insecureSkipVerify }} - - --insecure-skip-verify - {{- end }} - {{- if .Values.clients.https.useServiceAccountCredentials }} - - --token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- end }} - {{- if .Values.clients.https.certDir }} - - --tls.cert=/etc/ssl/push-proxy/push-proxy.pem - - --tls.key=/etc/ssl/push-proxy/push-proxy-key.pem - - --tls.cacert=/etc/ssl/push-proxy/push-proxy-ca-cert.pem - {{- end }} - {{- end }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if .Values.clients.metrics.enabled }} - - name: PORT - value: :{{ .Values.clients.port }} - {{- end }} - - name: PROXY_URL - value: {{ template "pushProxy.proxyUrl" . }} - securityContext: - runAsNonRoot: true - runAsUser: 1000 - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - volumeMounts: - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - {{- end }} - {{- if .Values.clients.resources }} - resources: {{ toYaml .Values.clients.resources | nindent 10 }} - {{- end }} - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - initContainers: - - name: copy-certs - image: {{ template "system_default_registry" . }}{{ .Values.clients.copyCertsImage.repository }}:{{ .Values.clients.copyCertsImage.tag }} - command: - - sh - - -c - - | - echo "Searching for files to copy within the source volume" - echo "cert: ${CERT_FILE_NAME}" - echo "key: ${KEY_FILE_NAME}" - echo "cacert: ${CACERT_FILE_NAME}" - - CERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CERT_FILE_NAME}" | sort -r | head -n 1) - KEY_FILE_SOURCE=$(find /etc/source/ -type f -name "${KEY_FILE_NAME}" | sort -r | head -n 1) - CACERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CACERT_FILE_NAME}" | sort -r | head -n 1) - - test -z ${CERT_FILE_SOURCE} && echo "Failed to find cert file" && exit 1 - test -z ${KEY_FILE_SOURCE} && echo "Failed to find key file" && exit 1 - test -z ${CACERT_FILE_SOURCE} && echo "Failed to find cacert file" && exit 1 - - echo "Copying cert file from $CERT_FILE_SOURCE to $CERT_FILE_TARGET" - cp $CERT_FILE_SOURCE $CERT_FILE_TARGET || exit 1 - chmod 444 $CERT_FILE_TARGET || exit 1 - - echo "Copying key file from $KEY_FILE_SOURCE to $KEY_FILE_TARGET" - cp $KEY_FILE_SOURCE $KEY_FILE_TARGET || exit 1 - chmod 444 $KEY_FILE_TARGET || exit 1 - - echo "Copying cacert file from $CACERT_FILE_SOURCE to $CACERT_FILE_TARGET" - cp $CACERT_FILE_SOURCE $CACERT_FILE_TARGET || exit 1 - chmod 444 $CACERT_FILE_TARGET || exit 1 - env: - - name: CERT_FILE_NAME - value: {{ required "Need a TLS cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.certFile }} - - name: KEY_FILE_NAME - value: {{ required "Need a TLS key file for scraping metrics endpoint over HTTPs" .Values.clients.https.keyFile }} - - name: CACERT_FILE_NAME - value: {{ required "Need a TLS CA cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.caCertFile }} - - name: CERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy.pem - - name: KEY_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-key.pem - - name: CACERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-ca-cert.pem - securityContext: - runAsNonRoot: false -{{- if and .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 12 }} -{{- end }} - volumeMounts: - - name: metrics-cert-dir-source - mountPath: /etc/source - readOnly: true - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - volumes: - - name: metrics-cert-dir-source - hostPath: - path: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - - name: metrics-cert-dir - emptyDir: {} - {{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-proxy-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-proxy-rbac.yaml deleted file mode 100644 index eefe609058..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-proxy-rbac.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.proxy.name" . }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.proxy.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- end }}{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-proxy.yaml deleted file mode 100644 index 723bbd6c00..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-proxy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} - pushprox-exporter: "proxy" -spec: - selector: - matchLabels: {{ include "pushProxy.proxy.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.proxy.labels" . | nindent 8 }} - spec: - securityContext: - runAsNonRoot: true - runAsUser: 1000 - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.proxy.nodeSelector }} -{{ toYaml .Values.proxy.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.proxy.tolerations }} -{{ toYaml .Values.proxy.tolerations | indent 8 }} -{{- end }} - serviceAccountName: {{ template "pushProxy.proxy.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-proxy - image: {{ template "system_default_registry" . }}{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag }} - command: - {{- range .Values.proxy.command }} - - {{ . | quote }} - {{- end }} - {{- if .Values.proxy.resources }} - resources: {{ toYaml .Values.proxy.resources | nindent 10 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - ports: - - name: pp-proxy - port: {{ required "Need .Values.proxy.port to configure proxy" .Values.proxy.port }} - protocol: TCP - targetPort: {{ .Values.proxy.port }} - selector: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-servicemonitor.yaml deleted file mode 100644 index 67eb2216b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/pushprox-servicemonitor.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.serviceMonitor }}{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "pushprox.serviceMonitor.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.serviceMonitor.labels" . | nindent 4 }} -spec: - endpoints: {{include "pushProxy.serviceMonitor.endpoints" . | nindent 4 }} - jobLabel: component - podTargetLabels: - - component - - pushprox-exporter - namespaceSelector: - matchNames: - - {{ template "pushprox.namespace" . }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} ---- -{{- $selector := "" }} -{{- if not (kindIs "invalid" .Values.service) }} -{{- if not (kindIs "invalid" .Values.service.selector) }} -{{ if .Values.service.selector }} -{{- if .Values.clients.enabled }} -{{- required (printf "Cannot override .Values.service.selector=%s when .Values.clients.enabled=true" (toJson .Values.service.selector)) "" }} -{{- end }} -{{- $selector = (toYaml .Values.service.selector) }} -{{- end }} -{{- end }} -{{- end }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - ports: - - name: metrics - port: {{ required "Need .Values.metricsPort to configure client to listen to metrics at port" .Values.metricsPort}} - protocol: TCP - targetPort: {{ .Values.metricsPort }} - selector: {{ default (include "pushProxy.client.labels" .) $selector | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/validate-install-crd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/validate-install-crd.yaml deleted file mode 100644 index 16abc2fa83..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/validate-install-crd.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -# {{- $found := dict -}} -# {{- set $found "monitoring.coreos.com/v1/ServiceMonitor" false -}} -# {{- range .Capabilities.APIVersions -}} -# {{- if hasKey $found (toString .) -}} -# {{- set $found (toString .) true -}} -# {{- end -}} -# {{- end -}} -# {{- range $_, $exists := $found -}} -# {{- if (eq $exists false) -}} -# {{- required "Required CRDs are missing. Please install Prometheus Operator CRDs before installing this chart." "" -}} -# {{- end -}} -# {{- end -}} -#{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/validate-psp-install.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/values.yaml deleted file mode 100644 index 1e076041b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2IngressNginx/values.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# Default values for rancher-pushprox. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Default image containing both the proxy and the client was generated from the following Dockerfile -# https://github.com/prometheus-community/PushProx/blob/eeadbe766641699129920ccfaaaa30a85c67fe81/Dockerfile#L1-L15 - -# Configuration - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - seLinux: - enabled: false - -# A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. -# -# For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches -# any of the semver constraints provided as keys on the map. -# -# On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. -# -# If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. -# -# Notes: -# - On running a helm template, Helm generally assumes the kubeVersion is v1.20.0 -# - On running a helm install --dry-run, the correct kubeVersion should be chosen. -kubeVersionOverrides: [] -# - constraint: "< 1.21" -# values: -# metricsPort: 10252 -# clients: -# https: -# enabled: false -# insecureSkipVerify: false -# useServiceAccountCredentials: false - -namespaceOverride: "" - -# The component that is being monitored (i.e. etcd) -component: "component" - -# The port containing the metrics that need to be scraped -metricsPort: 2739 - -# Configure ServiceMonitor that monitors metrics from the metricsPort endpoint -serviceMonitor: - enabled: true - # A list of endpoints that will be added to the ServiceMonitor based on the Endpoint spec - # Source: https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint - # By default, proxyUrl and params._scheme will be overridden based on other values - endpoints: - - port: metrics - -# Configure Service that grabs scrape targets -service: - # The selector that is used to populate the Service's Endpoints object. - # The chart will error out on rendering templating if .Values.clients.enabled is set alongside this field, - # since it is expected that this service should point to the PushProx Clients Daemonset / Deployment - selector: {} - -clients: - enabled: true - # The port which the PushProx client will post PushProx metrics to - port: 9369 - # If unset, this will default to the URL for the proxy service: http://pushprox-{{component}}-proxy.{{namepsace}}.svc.cluster.local:{{proxy.port}} - # Should be modified if the clients are being deployed outside the cluster where the proxy rests, otherwise leave it null - proxyUrl: "" - # If set to true, the client will forward any requests from the host IP to 127.0.0.1 - # It will only allow proxy requests to the metricsPort specified - useLocalhost: false - # Configuration for accessing metrics via HTTPS - https: - # Does the client require https to access the metrics? - enabled: false - # Does the client require requests be sent to http or https? - forceHTTPSScheme: false - # If set to true, the client will create a service account with adequate permissions and set a flag - # on the client to use the service account token provided by it to make authorized scrape requests - useServiceAccountCredentials: false - # Configuration for authentication to metrics via https endpoint - authenticationMethod: - # Reads token from defined file in container - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenFile: - enabled: false - bearerTokenFilePath: "/var/run/secrets/kubernetes.io/serviceaccount/token" - # Reads token from defined secret in namespace - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenSecret: - enabled: false - # Reads token from defined secret in namespace - authorization: - enabled: false - type: "bearer" - credentials: - key: "token" - optional: false - # If set to true, the client will disable SSL security checks - insecureSkipVerify: false - # Directory on host where necessary TLS cert and key to scrape metrics can be found - certDir: "" - # Filenames for files located in .Values.clients.https.certDir that correspond to TLS settings - certFile: "" - keyFile: "" - caCertFile: "" - # seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. - # Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. - seLinuxOptions: {} - - metrics: - # Whether the client should publish PushProx client-specific metrics to .Values.clients.port - enabled: false - - rbac: - # Additional permissions to provide to the ServiceAccount bound to the client - # This can be used to provide additional permissions for the client to scrape metrics from the k8s API - # Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true - additionalRules: [] - - # Resource limits - resources: {} - - # Options to select all nodes to deploy client DaemonSet on - nodeSelector: {} - tolerations: [] - affinity: {} - - image: - repository: rancher/pushprox-client - tag: v0.1.3-rancher2-client - command: ["pushprox-client"] - - copyCertsImage: - repository: rancher/mirrored-library-busybox - tag: 1.31.1 - - # The default intention of rancher-pushprox clients is to scrape hostNetwork metrics across all nodes. - # This can be used to scrape internal Kubernetes components or DaemonSets of hostNetwork Pods in - # situations where a cloud provider firewall prevents Pod-To-Host communication but not Pod-To-Pod. - # However, if the underlying hostNetwork Pod that is being scraped is managed by a Deployment, - # this advanced option enables users to deploy the client as a Deployment instead of a DaemonSet. - # If a user deploys this feature and the underlying Deployment's number of replicas changes, the user will - # be responsible for upgrading this chart accordingly to the right number of replicas. - deployment: - enabled: false - replicas: 0 - -proxy: - enabled: true - # The port through which PushProx clients will communicate to the proxy - port: 8080 - - # Resource limits - resources: {} - - # Options to select a node to run a single proxy deployment on - nodeSelector: {} - tolerations: [] - - image: - repository: rancher/pushprox-proxy - tag: v0.1.3-rancher2-proxy - command: ["pushprox-proxy"] diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/Chart.yaml deleted file mode 100644 index ee5326f70a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/Chart.yaml +++ /dev/null @@ -1,14 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.29.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-pushprox -apiVersion: v1 -appVersion: 0.1.0 -description: Sets up a deployment of the PushProx proxy and a DaemonSet of PushProx - clients. -name: rke2Proxy -type: application -version: 0.2.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/README.md deleted file mode 100644 index 345002f48a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# rancher-pushprox - -A Rancher chart based on Rancher [PushProx](https://github.com/rancher/PushProx) that sets up a Deployment of a PushProx proxy and a DaemonSet of PushProx clients on a Kubernetes cluster. - -Installs [rancher-pushprox](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-pushprox) to create PushProx clients that can access their host's network and register with a PushProx proxy. A [Prometheus Operator](https://github.com/coreos/prometheus-operator) ServiceMonitor CR is also included that is configured to scrape the metrics from each of the clients through the proxy. - -Using an instance of this chart is suitable for the following scenarios: -- You need to scrape metrics from a port that should not be accessible outside of the host (e.g. scraping `etcd` metrics in a hardened cluster) -- You need to scrape metrics on a host that are not exposed outside of 127.0.0.1 (e.g. scraping `kube-proxy` metrics) -- You need to scrape metrics through HTTPS using certs hosted directly on `hostPath` -- You need to scrape metrics from Kubernetes components that require authorization via a service account (e.g. permissions to make request to `/metrics`) -- You need to scrape metrics without access to cacerts (i.e. enable `insecureSkipVerify`) - -The clients and proxy are created based on a Rancher fork of the [prometheus-community/PushProx](https://github.com/prometheus-community/PushProx) project. - -## Upgrading to Kubernetes v1.25+ - -Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. - -As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `global.cattle.psp.enabled` set to `false` if it has been previously set to `true`. -​ -> **Note:** -> In this chart release, any previous field that was associated with any PSP resources have been removed in favor of a single global field: `global.cattle.psp.enabled`. - -> **Note:** -> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** -> -> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. - -Upon setting `global.cattle.psp.enabled` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. - -As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. - -## Configuration - -The following tables list the configurable parameters of the rancher-pushprox chart and their default values. - -### General - -#### Required -| Parameter | Description | Example | -| ----- | ----------- | ------ | -| `component` | The component that is being monitored | `kube-etcd` -| `metricsPort` | The port on the host that contains the metrics you want to scrape (e.g. `http://:/metrics`) | `2379` | -| `namespaceOverride` | The namespace to install the chart | `""` - -#### Optional -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `serviceMonitor.enabled` | Deploys a [Prometheus Operator](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor) ServiceMonitor CR that is configured to scrape metrics on the hosts that the clients are deployed on via the proxy. Also deploys a Service that points to all pods with the expected client name that exposes the `metricsPort` selected | `true` | -| `serviceMonitor.endpoints` | A list of endpoints that will be added to the ServiceMonitor based on the [Endpoint spec](https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint) | `[{port: metrics}]` | -| `service.selector` | The selector that is used to populate the Service's Endpoints object. The chart will error out on rendering templating if `.Values.clients.enabled` is set alongside this field, since it is expected that this service should point to the PushProx Clients Daemonset / Deployment | `{}` | -| `clients.enabled` | Deploys a DaemonSet of clients that are each capable of scraping endpoints on the hostNetwork it is deployed on | `true` | -| `clients.port` | The port where the client will publish PushProx client-specific metrics. If deploying multiple clients onto the same node, the clients should not have conflicting ports | `9369` | -| `clients.proxyUrl` | Overrides the default proxyUrl setting of `http://pushprox-{{ .Values.component }}-proxy.{{ . Release.Namespace }}.svc.cluster.local:{{ .Values.proxy.port }}"` with the `proxyUrl` specified | `""` | -| `clients.useLocalhost` | Sets a flag on each client deployment to redirect scrapes directed to `HOST_IP` to `127.0.0.1` | `false` | -| `clients.https.enabled` | Enables scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.forceHTTPSScheme` | Forces scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.useServiceAccountCredentials` | If set to true, the client will create a service account with permissions to scrape `/metrics` endpoint of Kubernetes components. The client will use the service account token provided to make authorized scrape requests to the Kubernetes API | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.enabled` | If set to true, the client will use service account credentials mounted at the configured path `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath`. This requires permissions to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath` | This is a volume mount on the pod with permissions to scrape `/metrics` endpoint of Kubernetes components | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | -| `clients.https.authenticationMethod.bearerTokenSecret.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.authorization.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components | `false` | -| `clients.https.authenticationMethod.authorization.type` | If set, the client will use this type of authorization in its client requests for metrics | `"bearer"` | -| `clients.https.authenticationMethod.authorization.credentials.key` | If set, the client will use this key in the secret created by `clients.https.useServiceAccountCredentials` for authorization in its client requests for metrics | `"token"` | -| `clients.https.authenticationMethod.authorization.credentials.optional` | If set to false, the client will fail if the key in the secret created by `clients.https.useServiceAccountCredentials` does not exist | `false` | -| `clients.https.insecureSkipVerify` | If set to true, the client will disable SSL security checks | `false` | -| `clients.https.certDir` | A `hostPath` where TLS certs can be found. This path is mounted as a volume on an `initContainer` which copies only the necessary files over to an EmptyDir volume used by each client. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.certFile` | The path to the TLS cert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.keyFile` | The path to the TLS key file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.caCertFile` | The path to the TLS cacert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.seLinuxOptions` | seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. | `""` | -| `clients.metrics.enabled` | Whether the client should publish PushProx client-specific metrics. | `false` | -| `clients.rbac.additionalRules` | Additional permissions to provide to the ServiceAccount bound to the client. This can be used to provide additional permissions for the client to scrape metrics from the k8s API. Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true | `[]` | -| `clients.deployment.enabled` | Deploys the client as a Deployment (generally used if the underlying hostNetwork Pod that is being scraped is managed by a Deployment) | `false` | -| `clients.deployment.replicas` | The number of pods the Deployment has, it should match the number of pod the hostNetwork Deployment has. Required and only used if `client.deployment.enable` is set | `0` | -| `clients.deployment.affinity` | The affinity rules that allocate the pod to the node in which the hostNetwork Deployment's pods run. Required and only used if `client.deployment.enable` is set | `{}` | -| `clients.resources` | Set resource limits and requests for the client container | `{}` | -| `clients.nodeSelector` | Select which nodes to deploy the clients on | `{}` | -| `clients.tolerations` | Specify tolerations for clients | `[]` | -| `proxy.enabled` | Deploys the proxy that each client will register with | `true` | -| `proxy.port` | The port exposed by the proxy that each client will register with to allow metrics to be scraped from the host | `8080` | -| `proxy.resources` | Set resource limits and requests for the proxy container | `{}` | -| `proxy.nodeSelector` | Select which nodes the proxy can be deployed on | `{}` | -| `proxy.tolerations` | Specify tolerations (if necessary) to allow the proxy to be deployed on the selected node | `[]` | -| `kubeVersionOverrides` | A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches any of the semver constraints provided as keys on the map. On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. | `[]` - -*Tip: The filepaths set in `clients.https.File` can include wildcard characters*. - -See [rancher-monitoring](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-monitoring) for examples of how this chart can be used. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/_helpers.tpl deleted file mode 100644 index 8e651dccfd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/_helpers.tpl +++ /dev/null @@ -1,166 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# General - -{{- define "applyKubeVersionOverrides" -}} -{{- $overrides := dict -}} -{{- range $override := .Values.kubeVersionOverrides -}} -{{- if semverCompare $override.constraint $.Capabilities.KubeVersion.Version -}} -{{- $_ := mergeOverwrite $overrides $override.values -}} -{{- end -}} -{{- end -}} -{{- $_ := mergeOverwrite .Values $overrides -}} -{{- end -}} - -{{- define "pushprox.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{- define "pushProxy.commonLabels" -}} -release: {{ .Release.Name }} -component: {{ .Values.component | quote }} -provider: kubernetes -{{- end -}} - -{{- define "pushProxy.proxyUrl" -}} -{{- $_ := (required "Template requires either .Values.proxy.port or .Values.client.proxyUrl to set proxyUrl for client" (or .Values.clients.proxyUrl .Values.proxy.port)) -}} -{{- if .Values.clients.proxyUrl -}} -{{ printf "%s" .Values.clients.proxyUrl }} -{{- else -}} -{{ printf "http://%s.%s.svc:%d" (include "pushProxy.proxy.name" .) (include "pushprox.namespace" .) (int .Values.proxy.port) }} -{{- end -}}{{- end -}} - -# Client - -{{- define "pushProxy.client.name" -}} -{{- printf "pushprox-%s-client" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.serviceAccountTokenName" -}} -{{- printf "pushprox-%s-client-service-account-token" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.labels" -}} -k8s-app: {{ template "pushProxy.client.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# Proxy - -{{- define "pushProxy.proxy.name" -}} -{{- printf "pushprox-%s-proxy" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.proxy.labels" -}} -k8s-app: {{ template "pushProxy.proxy.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# ServiceMonitor - -{{- define "pushprox.serviceMonitor.name" -}} -{{- printf "%s-%s" .Release.Name (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.labels" -}} -app: {{ template "pushprox.serviceMonitor.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.endpoints" -}} -{{- $proxyURL := (include "pushProxy.proxyUrl" .) -}} -{{- $useHTTPS := .Values.clients.https.enabled -}} -{{- $forceHTTPSScheme := .Values.clients.https.forceHTTPSScheme -}} -{{- $insecureSkipVerify := .Values.clients.https.insecureSkipVerify -}} -{{- $useServiceAccountCredentials := .Values.clients.https.useServiceAccountCredentials -}} -{{- $serviceAccountTokenName := (include "pushProxy.client.serviceAccountTokenName" . ) -}} -{{- $metricRelabelings := list }} -{{- $endpoints := .Values.serviceMonitor.endpoints }} -{{- range $endpoints }} -{{- if $.Values.proxy.enabled }} -{{- $_ := set . "proxyUrl" $proxyURL }} -{{- end }} -{{- $clusterIdRelabel := dict }} -{{- if $.Values.global.cattle.clusterId }} -{{- $_ := set $clusterIdRelabel "action" "replace" }} -{{- $_ := set $clusterIdRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterIdRelabel "targetLabel" "cluster_id" }} -{{- $_ := set $clusterIdRelabel "replacement" $.Values.global.cattle.clusterId }} -{{- end }} -{{- $clusterNameRelabel := dict }} -{{- if $.Values.global.cattle.clusterName }} -{{- $_ := set $clusterNameRelabel "action" "replace" }} -{{- $_ := set $clusterNameRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterNameRelabel "targetLabel" "cluster_name" }} -{{- $_ := set $clusterNameRelabel "replacement" $.Values.global.cattle.clusterName }} -{{- end }} -{{- $metricRelabelings := gt (len (keys $clusterNameRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterNameRelabel)) ($metricRelabelings) }} -{{- $metricRelabelings := gt (len (keys $clusterIdRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterIdRelabel)) ($metricRelabelings) }} -{{- if not (empty $metricRelabelings) }} -{{- $_ := set . "metricRelabelings" ($metricRelabelings)}} -{{- end }} -{{- if $forceHTTPSScheme -}} -{{- $_ := set . "scheme" "https" }} -{{- end -}} -{{- if $useHTTPS -}} -{{- if (hasKey . "params") }} -{{- $_ := set (get . "params") "_scheme" (list "https") }} -{{- else }} -{{- $_ := set . "params" (dict "_scheme" (list "https")) }} -{{- end }} -{{- end }} -{{- if (hasKey . "tlsConfig") }} -{{- $_ := set (get . "tlsConfig") "insecureSkipVerify" $insecureSkipVerify }} -{{- else }} -{{- $_ := set . "tlsConfig" (dict "insecureSkipVerify" $insecureSkipVerify) }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenFile.enabled }} -{{- $_ := set . "bearerTokenFile" $.Values.clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenSecret.enabled }} -{{- $_ := set . "bearerTokenSecret" $serviceAccountTokenName }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.authorization.enabled }} -{{- if (hasKey . "authorization") }} -{{- $_ := set (get . "authorization") "type" $.Values.clients.https.authenticationMethod.authorization.type }} -{{- $_ := set (get . "authorization") "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional) }} -{{- else }} -{{- $_ := set . "authorization" (dict "type" $.Values.clients.https.authenticationMethod.authorization.type) }} -{{- $_ := set . "authorization" (dict "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional)) }} -{{- end }} -{{- end }} -{{- end }} -{{- toYaml $endpoints }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-clients-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-clients-rbac.yaml deleted file mode 100644 index a8e27c3735..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-clients-rbac.yaml +++ /dev/null @@ -1,97 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.client.name" . }} -{{- end }} -{{- if and .Values.clients.https.enabled .Values.clients.https.useServiceAccountCredentials }} -- nonResourceURLs: ["/metrics"] - verbs: ["get"] -{{- if .Values.clients.rbac.additionalRules }} -{{ toYaml .Values.clients.rbac.additionalRules }} -{{- end }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.client.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} ---- -{{- if .Values.clients.https.useServiceAccountCredentials }} -apiVersion: v1 -kind: Secret -type: kubernetes.io/service-account-token -metadata: - name: {{ template "pushProxy.client.serviceAccountTokenName" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - annotations: - kubernetes.io/service-account.name: {{ template "pushProxy.client.name" . }} -{{- end }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: true - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 6 }} -{{- end }} - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - - 'emptyDir' - - 'hostPath' - allowedHostPaths: - - pathPrefix: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - readOnly: true -{{- end }} -{{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-clients.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-clients.yaml deleted file mode 100644 index e8fcfb3883..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-clients.yaml +++ /dev/null @@ -1,157 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: apps/v1 -{{- if .Values.clients.deployment.enabled }} -kind: Deployment -{{- else }} -kind: DaemonSet -{{- end }} -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - pushprox-exporter: "client" -spec: - {{- if .Values.clients.deployment.enabled }} - replicas: {{ .Values.clients.deployment.replicas }} - {{- end }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.client.labels" . | nindent 8 }} - spec: - {{- if .Values.clients.affinity }} - affinity: {{ toYaml .Values.clients.affinity | nindent 8 }} - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.clients.nodeSelector }} -{{ toYaml .Values.clients.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.clients.tolerations }} -{{ toYaml .Values.clients.tolerations | indent 8 }} -{{- end }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - serviceAccountName: {{ template "pushProxy.client.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-client - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - {{- range .Values.clients.command }} - - {{ . | quote }} - {{- end }} - args: - - --fqdn=$(HOST_IP) - - --proxy-url=$(PROXY_URL) - {{- if .Values.clients.metrics.enabled }} - - --metrics-addr=$(PORT) - {{- end }} - - --allow-port={{ required "Need .Values.metricsPort to configure client to be allowed to scrape metrics at port" .Values.metricsPort}} - {{- if .Values.clients.useLocalhost }} - - --use-localhost - {{- end }} - {{- if .Values.clients.https.enabled }} - {{- if .Values.clients.https.insecureSkipVerify }} - - --insecure-skip-verify - {{- end }} - {{- if .Values.clients.https.useServiceAccountCredentials }} - - --token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- end }} - {{- if .Values.clients.https.certDir }} - - --tls.cert=/etc/ssl/push-proxy/push-proxy.pem - - --tls.key=/etc/ssl/push-proxy/push-proxy-key.pem - - --tls.cacert=/etc/ssl/push-proxy/push-proxy-ca-cert.pem - {{- end }} - {{- end }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if .Values.clients.metrics.enabled }} - - name: PORT - value: :{{ .Values.clients.port }} - {{- end }} - - name: PROXY_URL - value: {{ template "pushProxy.proxyUrl" . }} - securityContext: - runAsNonRoot: true - runAsUser: 1000 - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - volumeMounts: - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - {{- end }} - {{- if .Values.clients.resources }} - resources: {{ toYaml .Values.clients.resources | nindent 10 }} - {{- end }} - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - initContainers: - - name: copy-certs - image: {{ template "system_default_registry" . }}{{ .Values.clients.copyCertsImage.repository }}:{{ .Values.clients.copyCertsImage.tag }} - command: - - sh - - -c - - | - echo "Searching for files to copy within the source volume" - echo "cert: ${CERT_FILE_NAME}" - echo "key: ${KEY_FILE_NAME}" - echo "cacert: ${CACERT_FILE_NAME}" - - CERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CERT_FILE_NAME}" | sort -r | head -n 1) - KEY_FILE_SOURCE=$(find /etc/source/ -type f -name "${KEY_FILE_NAME}" | sort -r | head -n 1) - CACERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CACERT_FILE_NAME}" | sort -r | head -n 1) - - test -z ${CERT_FILE_SOURCE} && echo "Failed to find cert file" && exit 1 - test -z ${KEY_FILE_SOURCE} && echo "Failed to find key file" && exit 1 - test -z ${CACERT_FILE_SOURCE} && echo "Failed to find cacert file" && exit 1 - - echo "Copying cert file from $CERT_FILE_SOURCE to $CERT_FILE_TARGET" - cp $CERT_FILE_SOURCE $CERT_FILE_TARGET || exit 1 - chmod 444 $CERT_FILE_TARGET || exit 1 - - echo "Copying key file from $KEY_FILE_SOURCE to $KEY_FILE_TARGET" - cp $KEY_FILE_SOURCE $KEY_FILE_TARGET || exit 1 - chmod 444 $KEY_FILE_TARGET || exit 1 - - echo "Copying cacert file from $CACERT_FILE_SOURCE to $CACERT_FILE_TARGET" - cp $CACERT_FILE_SOURCE $CACERT_FILE_TARGET || exit 1 - chmod 444 $CACERT_FILE_TARGET || exit 1 - env: - - name: CERT_FILE_NAME - value: {{ required "Need a TLS cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.certFile }} - - name: KEY_FILE_NAME - value: {{ required "Need a TLS key file for scraping metrics endpoint over HTTPs" .Values.clients.https.keyFile }} - - name: CACERT_FILE_NAME - value: {{ required "Need a TLS CA cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.caCertFile }} - - name: CERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy.pem - - name: KEY_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-key.pem - - name: CACERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-ca-cert.pem - securityContext: - runAsNonRoot: false -{{- if and .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 12 }} -{{- end }} - volumeMounts: - - name: metrics-cert-dir-source - mountPath: /etc/source - readOnly: true - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - volumes: - - name: metrics-cert-dir-source - hostPath: - path: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - - name: metrics-cert-dir - emptyDir: {} - {{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-proxy-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-proxy-rbac.yaml deleted file mode 100644 index eefe609058..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-proxy-rbac.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.proxy.name" . }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.proxy.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- end }}{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-proxy.yaml deleted file mode 100644 index 723bbd6c00..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-proxy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} - pushprox-exporter: "proxy" -spec: - selector: - matchLabels: {{ include "pushProxy.proxy.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.proxy.labels" . | nindent 8 }} - spec: - securityContext: - runAsNonRoot: true - runAsUser: 1000 - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.proxy.nodeSelector }} -{{ toYaml .Values.proxy.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.proxy.tolerations }} -{{ toYaml .Values.proxy.tolerations | indent 8 }} -{{- end }} - serviceAccountName: {{ template "pushProxy.proxy.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-proxy - image: {{ template "system_default_registry" . }}{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag }} - command: - {{- range .Values.proxy.command }} - - {{ . | quote }} - {{- end }} - {{- if .Values.proxy.resources }} - resources: {{ toYaml .Values.proxy.resources | nindent 10 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - ports: - - name: pp-proxy - port: {{ required "Need .Values.proxy.port to configure proxy" .Values.proxy.port }} - protocol: TCP - targetPort: {{ .Values.proxy.port }} - selector: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-servicemonitor.yaml deleted file mode 100644 index 67eb2216b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/pushprox-servicemonitor.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.serviceMonitor }}{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "pushprox.serviceMonitor.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.serviceMonitor.labels" . | nindent 4 }} -spec: - endpoints: {{include "pushProxy.serviceMonitor.endpoints" . | nindent 4 }} - jobLabel: component - podTargetLabels: - - component - - pushprox-exporter - namespaceSelector: - matchNames: - - {{ template "pushprox.namespace" . }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} ---- -{{- $selector := "" }} -{{- if not (kindIs "invalid" .Values.service) }} -{{- if not (kindIs "invalid" .Values.service.selector) }} -{{ if .Values.service.selector }} -{{- if .Values.clients.enabled }} -{{- required (printf "Cannot override .Values.service.selector=%s when .Values.clients.enabled=true" (toJson .Values.service.selector)) "" }} -{{- end }} -{{- $selector = (toYaml .Values.service.selector) }} -{{- end }} -{{- end }} -{{- end }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - ports: - - name: metrics - port: {{ required "Need .Values.metricsPort to configure client to listen to metrics at port" .Values.metricsPort}} - protocol: TCP - targetPort: {{ .Values.metricsPort }} - selector: {{ default (include "pushProxy.client.labels" .) $selector | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/validate-install-crd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/validate-install-crd.yaml deleted file mode 100644 index 16abc2fa83..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/validate-install-crd.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -# {{- $found := dict -}} -# {{- set $found "monitoring.coreos.com/v1/ServiceMonitor" false -}} -# {{- range .Capabilities.APIVersions -}} -# {{- if hasKey $found (toString .) -}} -# {{- set $found (toString .) true -}} -# {{- end -}} -# {{- end -}} -# {{- range $_, $exists := $found -}} -# {{- if (eq $exists false) -}} -# {{- required "Required CRDs are missing. Please install Prometheus Operator CRDs before installing this chart." "" -}} -# {{- end -}} -# {{- end -}} -#{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/validate-psp-install.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/values.yaml deleted file mode 100644 index 1e076041b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Proxy/values.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# Default values for rancher-pushprox. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Default image containing both the proxy and the client was generated from the following Dockerfile -# https://github.com/prometheus-community/PushProx/blob/eeadbe766641699129920ccfaaaa30a85c67fe81/Dockerfile#L1-L15 - -# Configuration - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - seLinux: - enabled: false - -# A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. -# -# For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches -# any of the semver constraints provided as keys on the map. -# -# On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. -# -# If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. -# -# Notes: -# - On running a helm template, Helm generally assumes the kubeVersion is v1.20.0 -# - On running a helm install --dry-run, the correct kubeVersion should be chosen. -kubeVersionOverrides: [] -# - constraint: "< 1.21" -# values: -# metricsPort: 10252 -# clients: -# https: -# enabled: false -# insecureSkipVerify: false -# useServiceAccountCredentials: false - -namespaceOverride: "" - -# The component that is being monitored (i.e. etcd) -component: "component" - -# The port containing the metrics that need to be scraped -metricsPort: 2739 - -# Configure ServiceMonitor that monitors metrics from the metricsPort endpoint -serviceMonitor: - enabled: true - # A list of endpoints that will be added to the ServiceMonitor based on the Endpoint spec - # Source: https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint - # By default, proxyUrl and params._scheme will be overridden based on other values - endpoints: - - port: metrics - -# Configure Service that grabs scrape targets -service: - # The selector that is used to populate the Service's Endpoints object. - # The chart will error out on rendering templating if .Values.clients.enabled is set alongside this field, - # since it is expected that this service should point to the PushProx Clients Daemonset / Deployment - selector: {} - -clients: - enabled: true - # The port which the PushProx client will post PushProx metrics to - port: 9369 - # If unset, this will default to the URL for the proxy service: http://pushprox-{{component}}-proxy.{{namepsace}}.svc.cluster.local:{{proxy.port}} - # Should be modified if the clients are being deployed outside the cluster where the proxy rests, otherwise leave it null - proxyUrl: "" - # If set to true, the client will forward any requests from the host IP to 127.0.0.1 - # It will only allow proxy requests to the metricsPort specified - useLocalhost: false - # Configuration for accessing metrics via HTTPS - https: - # Does the client require https to access the metrics? - enabled: false - # Does the client require requests be sent to http or https? - forceHTTPSScheme: false - # If set to true, the client will create a service account with adequate permissions and set a flag - # on the client to use the service account token provided by it to make authorized scrape requests - useServiceAccountCredentials: false - # Configuration for authentication to metrics via https endpoint - authenticationMethod: - # Reads token from defined file in container - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenFile: - enabled: false - bearerTokenFilePath: "/var/run/secrets/kubernetes.io/serviceaccount/token" - # Reads token from defined secret in namespace - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenSecret: - enabled: false - # Reads token from defined secret in namespace - authorization: - enabled: false - type: "bearer" - credentials: - key: "token" - optional: false - # If set to true, the client will disable SSL security checks - insecureSkipVerify: false - # Directory on host where necessary TLS cert and key to scrape metrics can be found - certDir: "" - # Filenames for files located in .Values.clients.https.certDir that correspond to TLS settings - certFile: "" - keyFile: "" - caCertFile: "" - # seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. - # Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. - seLinuxOptions: {} - - metrics: - # Whether the client should publish PushProx client-specific metrics to .Values.clients.port - enabled: false - - rbac: - # Additional permissions to provide to the ServiceAccount bound to the client - # This can be used to provide additional permissions for the client to scrape metrics from the k8s API - # Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true - additionalRules: [] - - # Resource limits - resources: {} - - # Options to select all nodes to deploy client DaemonSet on - nodeSelector: {} - tolerations: [] - affinity: {} - - image: - repository: rancher/pushprox-client - tag: v0.1.3-rancher2-client - command: ["pushprox-client"] - - copyCertsImage: - repository: rancher/mirrored-library-busybox - tag: 1.31.1 - - # The default intention of rancher-pushprox clients is to scrape hostNetwork metrics across all nodes. - # This can be used to scrape internal Kubernetes components or DaemonSets of hostNetwork Pods in - # situations where a cloud provider firewall prevents Pod-To-Host communication but not Pod-To-Pod. - # However, if the underlying hostNetwork Pod that is being scraped is managed by a Deployment, - # this advanced option enables users to deploy the client as a Deployment instead of a DaemonSet. - # If a user deploys this feature and the underlying Deployment's number of replicas changes, the user will - # be responsible for upgrading this chart accordingly to the right number of replicas. - deployment: - enabled: false - replicas: 0 - -proxy: - enabled: true - # The port through which PushProx clients will communicate to the proxy - port: 8080 - - # Resource limits - resources: {} - - # Options to select a node to run a single proxy deployment on - nodeSelector: {} - tolerations: [] - - image: - repository: rancher/pushprox-proxy - tag: v0.1.3-rancher2-proxy - command: ["pushprox-proxy"] diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/Chart.yaml deleted file mode 100644 index 589d61947a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/Chart.yaml +++ /dev/null @@ -1,14 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.29.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-pushprox -apiVersion: v1 -appVersion: 0.1.0 -description: Sets up a deployment of the PushProx proxy and a DaemonSet of PushProx - clients. -name: rke2Scheduler -type: application -version: 0.2.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/README.md deleted file mode 100644 index 345002f48a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# rancher-pushprox - -A Rancher chart based on Rancher [PushProx](https://github.com/rancher/PushProx) that sets up a Deployment of a PushProx proxy and a DaemonSet of PushProx clients on a Kubernetes cluster. - -Installs [rancher-pushprox](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-pushprox) to create PushProx clients that can access their host's network and register with a PushProx proxy. A [Prometheus Operator](https://github.com/coreos/prometheus-operator) ServiceMonitor CR is also included that is configured to scrape the metrics from each of the clients through the proxy. - -Using an instance of this chart is suitable for the following scenarios: -- You need to scrape metrics from a port that should not be accessible outside of the host (e.g. scraping `etcd` metrics in a hardened cluster) -- You need to scrape metrics on a host that are not exposed outside of 127.0.0.1 (e.g. scraping `kube-proxy` metrics) -- You need to scrape metrics through HTTPS using certs hosted directly on `hostPath` -- You need to scrape metrics from Kubernetes components that require authorization via a service account (e.g. permissions to make request to `/metrics`) -- You need to scrape metrics without access to cacerts (i.e. enable `insecureSkipVerify`) - -The clients and proxy are created based on a Rancher fork of the [prometheus-community/PushProx](https://github.com/prometheus-community/PushProx) project. - -## Upgrading to Kubernetes v1.25+ - -Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. - -As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `global.cattle.psp.enabled` set to `false` if it has been previously set to `true`. -​ -> **Note:** -> In this chart release, any previous field that was associated with any PSP resources have been removed in favor of a single global field: `global.cattle.psp.enabled`. - -> **Note:** -> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** -> -> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. - -Upon setting `global.cattle.psp.enabled` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. - -As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. - -## Configuration - -The following tables list the configurable parameters of the rancher-pushprox chart and their default values. - -### General - -#### Required -| Parameter | Description | Example | -| ----- | ----------- | ------ | -| `component` | The component that is being monitored | `kube-etcd` -| `metricsPort` | The port on the host that contains the metrics you want to scrape (e.g. `http://:/metrics`) | `2379` | -| `namespaceOverride` | The namespace to install the chart | `""` - -#### Optional -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `serviceMonitor.enabled` | Deploys a [Prometheus Operator](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor) ServiceMonitor CR that is configured to scrape metrics on the hosts that the clients are deployed on via the proxy. Also deploys a Service that points to all pods with the expected client name that exposes the `metricsPort` selected | `true` | -| `serviceMonitor.endpoints` | A list of endpoints that will be added to the ServiceMonitor based on the [Endpoint spec](https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint) | `[{port: metrics}]` | -| `service.selector` | The selector that is used to populate the Service's Endpoints object. The chart will error out on rendering templating if `.Values.clients.enabled` is set alongside this field, since it is expected that this service should point to the PushProx Clients Daemonset / Deployment | `{}` | -| `clients.enabled` | Deploys a DaemonSet of clients that are each capable of scraping endpoints on the hostNetwork it is deployed on | `true` | -| `clients.port` | The port where the client will publish PushProx client-specific metrics. If deploying multiple clients onto the same node, the clients should not have conflicting ports | `9369` | -| `clients.proxyUrl` | Overrides the default proxyUrl setting of `http://pushprox-{{ .Values.component }}-proxy.{{ . Release.Namespace }}.svc.cluster.local:{{ .Values.proxy.port }}"` with the `proxyUrl` specified | `""` | -| `clients.useLocalhost` | Sets a flag on each client deployment to redirect scrapes directed to `HOST_IP` to `127.0.0.1` | `false` | -| `clients.https.enabled` | Enables scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.forceHTTPSScheme` | Forces scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.useServiceAccountCredentials` | If set to true, the client will create a service account with permissions to scrape `/metrics` endpoint of Kubernetes components. The client will use the service account token provided to make authorized scrape requests to the Kubernetes API | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.enabled` | If set to true, the client will use service account credentials mounted at the configured path `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath`. This requires permissions to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath` | This is a volume mount on the pod with permissions to scrape `/metrics` endpoint of Kubernetes components | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | -| `clients.https.authenticationMethod.bearerTokenSecret.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.authorization.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components | `false` | -| `clients.https.authenticationMethod.authorization.type` | If set, the client will use this type of authorization in its client requests for metrics | `"bearer"` | -| `clients.https.authenticationMethod.authorization.credentials.key` | If set, the client will use this key in the secret created by `clients.https.useServiceAccountCredentials` for authorization in its client requests for metrics | `"token"` | -| `clients.https.authenticationMethod.authorization.credentials.optional` | If set to false, the client will fail if the key in the secret created by `clients.https.useServiceAccountCredentials` does not exist | `false` | -| `clients.https.insecureSkipVerify` | If set to true, the client will disable SSL security checks | `false` | -| `clients.https.certDir` | A `hostPath` where TLS certs can be found. This path is mounted as a volume on an `initContainer` which copies only the necessary files over to an EmptyDir volume used by each client. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.certFile` | The path to the TLS cert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.keyFile` | The path to the TLS key file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.caCertFile` | The path to the TLS cacert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.seLinuxOptions` | seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. | `""` | -| `clients.metrics.enabled` | Whether the client should publish PushProx client-specific metrics. | `false` | -| `clients.rbac.additionalRules` | Additional permissions to provide to the ServiceAccount bound to the client. This can be used to provide additional permissions for the client to scrape metrics from the k8s API. Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true | `[]` | -| `clients.deployment.enabled` | Deploys the client as a Deployment (generally used if the underlying hostNetwork Pod that is being scraped is managed by a Deployment) | `false` | -| `clients.deployment.replicas` | The number of pods the Deployment has, it should match the number of pod the hostNetwork Deployment has. Required and only used if `client.deployment.enable` is set | `0` | -| `clients.deployment.affinity` | The affinity rules that allocate the pod to the node in which the hostNetwork Deployment's pods run. Required and only used if `client.deployment.enable` is set | `{}` | -| `clients.resources` | Set resource limits and requests for the client container | `{}` | -| `clients.nodeSelector` | Select which nodes to deploy the clients on | `{}` | -| `clients.tolerations` | Specify tolerations for clients | `[]` | -| `proxy.enabled` | Deploys the proxy that each client will register with | `true` | -| `proxy.port` | The port exposed by the proxy that each client will register with to allow metrics to be scraped from the host | `8080` | -| `proxy.resources` | Set resource limits and requests for the proxy container | `{}` | -| `proxy.nodeSelector` | Select which nodes the proxy can be deployed on | `{}` | -| `proxy.tolerations` | Specify tolerations (if necessary) to allow the proxy to be deployed on the selected node | `[]` | -| `kubeVersionOverrides` | A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches any of the semver constraints provided as keys on the map. On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. | `[]` - -*Tip: The filepaths set in `clients.https.File` can include wildcard characters*. - -See [rancher-monitoring](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-monitoring) for examples of how this chart can be used. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/_helpers.tpl deleted file mode 100644 index 8e651dccfd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/_helpers.tpl +++ /dev/null @@ -1,166 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# General - -{{- define "applyKubeVersionOverrides" -}} -{{- $overrides := dict -}} -{{- range $override := .Values.kubeVersionOverrides -}} -{{- if semverCompare $override.constraint $.Capabilities.KubeVersion.Version -}} -{{- $_ := mergeOverwrite $overrides $override.values -}} -{{- end -}} -{{- end -}} -{{- $_ := mergeOverwrite .Values $overrides -}} -{{- end -}} - -{{- define "pushprox.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{- define "pushProxy.commonLabels" -}} -release: {{ .Release.Name }} -component: {{ .Values.component | quote }} -provider: kubernetes -{{- end -}} - -{{- define "pushProxy.proxyUrl" -}} -{{- $_ := (required "Template requires either .Values.proxy.port or .Values.client.proxyUrl to set proxyUrl for client" (or .Values.clients.proxyUrl .Values.proxy.port)) -}} -{{- if .Values.clients.proxyUrl -}} -{{ printf "%s" .Values.clients.proxyUrl }} -{{- else -}} -{{ printf "http://%s.%s.svc:%d" (include "pushProxy.proxy.name" .) (include "pushprox.namespace" .) (int .Values.proxy.port) }} -{{- end -}}{{- end -}} - -# Client - -{{- define "pushProxy.client.name" -}} -{{- printf "pushprox-%s-client" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.serviceAccountTokenName" -}} -{{- printf "pushprox-%s-client-service-account-token" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.labels" -}} -k8s-app: {{ template "pushProxy.client.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# Proxy - -{{- define "pushProxy.proxy.name" -}} -{{- printf "pushprox-%s-proxy" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.proxy.labels" -}} -k8s-app: {{ template "pushProxy.proxy.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# ServiceMonitor - -{{- define "pushprox.serviceMonitor.name" -}} -{{- printf "%s-%s" .Release.Name (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.labels" -}} -app: {{ template "pushprox.serviceMonitor.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.endpoints" -}} -{{- $proxyURL := (include "pushProxy.proxyUrl" .) -}} -{{- $useHTTPS := .Values.clients.https.enabled -}} -{{- $forceHTTPSScheme := .Values.clients.https.forceHTTPSScheme -}} -{{- $insecureSkipVerify := .Values.clients.https.insecureSkipVerify -}} -{{- $useServiceAccountCredentials := .Values.clients.https.useServiceAccountCredentials -}} -{{- $serviceAccountTokenName := (include "pushProxy.client.serviceAccountTokenName" . ) -}} -{{- $metricRelabelings := list }} -{{- $endpoints := .Values.serviceMonitor.endpoints }} -{{- range $endpoints }} -{{- if $.Values.proxy.enabled }} -{{- $_ := set . "proxyUrl" $proxyURL }} -{{- end }} -{{- $clusterIdRelabel := dict }} -{{- if $.Values.global.cattle.clusterId }} -{{- $_ := set $clusterIdRelabel "action" "replace" }} -{{- $_ := set $clusterIdRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterIdRelabel "targetLabel" "cluster_id" }} -{{- $_ := set $clusterIdRelabel "replacement" $.Values.global.cattle.clusterId }} -{{- end }} -{{- $clusterNameRelabel := dict }} -{{- if $.Values.global.cattle.clusterName }} -{{- $_ := set $clusterNameRelabel "action" "replace" }} -{{- $_ := set $clusterNameRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterNameRelabel "targetLabel" "cluster_name" }} -{{- $_ := set $clusterNameRelabel "replacement" $.Values.global.cattle.clusterName }} -{{- end }} -{{- $metricRelabelings := gt (len (keys $clusterNameRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterNameRelabel)) ($metricRelabelings) }} -{{- $metricRelabelings := gt (len (keys $clusterIdRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterIdRelabel)) ($metricRelabelings) }} -{{- if not (empty $metricRelabelings) }} -{{- $_ := set . "metricRelabelings" ($metricRelabelings)}} -{{- end }} -{{- if $forceHTTPSScheme -}} -{{- $_ := set . "scheme" "https" }} -{{- end -}} -{{- if $useHTTPS -}} -{{- if (hasKey . "params") }} -{{- $_ := set (get . "params") "_scheme" (list "https") }} -{{- else }} -{{- $_ := set . "params" (dict "_scheme" (list "https")) }} -{{- end }} -{{- end }} -{{- if (hasKey . "tlsConfig") }} -{{- $_ := set (get . "tlsConfig") "insecureSkipVerify" $insecureSkipVerify }} -{{- else }} -{{- $_ := set . "tlsConfig" (dict "insecureSkipVerify" $insecureSkipVerify) }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenFile.enabled }} -{{- $_ := set . "bearerTokenFile" $.Values.clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenSecret.enabled }} -{{- $_ := set . "bearerTokenSecret" $serviceAccountTokenName }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.authorization.enabled }} -{{- if (hasKey . "authorization") }} -{{- $_ := set (get . "authorization") "type" $.Values.clients.https.authenticationMethod.authorization.type }} -{{- $_ := set (get . "authorization") "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional) }} -{{- else }} -{{- $_ := set . "authorization" (dict "type" $.Values.clients.https.authenticationMethod.authorization.type) }} -{{- $_ := set . "authorization" (dict "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional)) }} -{{- end }} -{{- end }} -{{- end }} -{{- toYaml $endpoints }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-clients-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-clients-rbac.yaml deleted file mode 100644 index a8e27c3735..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-clients-rbac.yaml +++ /dev/null @@ -1,97 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.client.name" . }} -{{- end }} -{{- if and .Values.clients.https.enabled .Values.clients.https.useServiceAccountCredentials }} -- nonResourceURLs: ["/metrics"] - verbs: ["get"] -{{- if .Values.clients.rbac.additionalRules }} -{{ toYaml .Values.clients.rbac.additionalRules }} -{{- end }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.client.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} ---- -{{- if .Values.clients.https.useServiceAccountCredentials }} -apiVersion: v1 -kind: Secret -type: kubernetes.io/service-account-token -metadata: - name: {{ template "pushProxy.client.serviceAccountTokenName" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - annotations: - kubernetes.io/service-account.name: {{ template "pushProxy.client.name" . }} -{{- end }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: true - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 6 }} -{{- end }} - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - - 'emptyDir' - - 'hostPath' - allowedHostPaths: - - pathPrefix: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - readOnly: true -{{- end }} -{{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-clients.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-clients.yaml deleted file mode 100644 index e8fcfb3883..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-clients.yaml +++ /dev/null @@ -1,157 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: apps/v1 -{{- if .Values.clients.deployment.enabled }} -kind: Deployment -{{- else }} -kind: DaemonSet -{{- end }} -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - pushprox-exporter: "client" -spec: - {{- if .Values.clients.deployment.enabled }} - replicas: {{ .Values.clients.deployment.replicas }} - {{- end }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.client.labels" . | nindent 8 }} - spec: - {{- if .Values.clients.affinity }} - affinity: {{ toYaml .Values.clients.affinity | nindent 8 }} - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.clients.nodeSelector }} -{{ toYaml .Values.clients.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.clients.tolerations }} -{{ toYaml .Values.clients.tolerations | indent 8 }} -{{- end }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - serviceAccountName: {{ template "pushProxy.client.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-client - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - {{- range .Values.clients.command }} - - {{ . | quote }} - {{- end }} - args: - - --fqdn=$(HOST_IP) - - --proxy-url=$(PROXY_URL) - {{- if .Values.clients.metrics.enabled }} - - --metrics-addr=$(PORT) - {{- end }} - - --allow-port={{ required "Need .Values.metricsPort to configure client to be allowed to scrape metrics at port" .Values.metricsPort}} - {{- if .Values.clients.useLocalhost }} - - --use-localhost - {{- end }} - {{- if .Values.clients.https.enabled }} - {{- if .Values.clients.https.insecureSkipVerify }} - - --insecure-skip-verify - {{- end }} - {{- if .Values.clients.https.useServiceAccountCredentials }} - - --token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- end }} - {{- if .Values.clients.https.certDir }} - - --tls.cert=/etc/ssl/push-proxy/push-proxy.pem - - --tls.key=/etc/ssl/push-proxy/push-proxy-key.pem - - --tls.cacert=/etc/ssl/push-proxy/push-proxy-ca-cert.pem - {{- end }} - {{- end }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if .Values.clients.metrics.enabled }} - - name: PORT - value: :{{ .Values.clients.port }} - {{- end }} - - name: PROXY_URL - value: {{ template "pushProxy.proxyUrl" . }} - securityContext: - runAsNonRoot: true - runAsUser: 1000 - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - volumeMounts: - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - {{- end }} - {{- if .Values.clients.resources }} - resources: {{ toYaml .Values.clients.resources | nindent 10 }} - {{- end }} - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - initContainers: - - name: copy-certs - image: {{ template "system_default_registry" . }}{{ .Values.clients.copyCertsImage.repository }}:{{ .Values.clients.copyCertsImage.tag }} - command: - - sh - - -c - - | - echo "Searching for files to copy within the source volume" - echo "cert: ${CERT_FILE_NAME}" - echo "key: ${KEY_FILE_NAME}" - echo "cacert: ${CACERT_FILE_NAME}" - - CERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CERT_FILE_NAME}" | sort -r | head -n 1) - KEY_FILE_SOURCE=$(find /etc/source/ -type f -name "${KEY_FILE_NAME}" | sort -r | head -n 1) - CACERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CACERT_FILE_NAME}" | sort -r | head -n 1) - - test -z ${CERT_FILE_SOURCE} && echo "Failed to find cert file" && exit 1 - test -z ${KEY_FILE_SOURCE} && echo "Failed to find key file" && exit 1 - test -z ${CACERT_FILE_SOURCE} && echo "Failed to find cacert file" && exit 1 - - echo "Copying cert file from $CERT_FILE_SOURCE to $CERT_FILE_TARGET" - cp $CERT_FILE_SOURCE $CERT_FILE_TARGET || exit 1 - chmod 444 $CERT_FILE_TARGET || exit 1 - - echo "Copying key file from $KEY_FILE_SOURCE to $KEY_FILE_TARGET" - cp $KEY_FILE_SOURCE $KEY_FILE_TARGET || exit 1 - chmod 444 $KEY_FILE_TARGET || exit 1 - - echo "Copying cacert file from $CACERT_FILE_SOURCE to $CACERT_FILE_TARGET" - cp $CACERT_FILE_SOURCE $CACERT_FILE_TARGET || exit 1 - chmod 444 $CACERT_FILE_TARGET || exit 1 - env: - - name: CERT_FILE_NAME - value: {{ required "Need a TLS cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.certFile }} - - name: KEY_FILE_NAME - value: {{ required "Need a TLS key file for scraping metrics endpoint over HTTPs" .Values.clients.https.keyFile }} - - name: CACERT_FILE_NAME - value: {{ required "Need a TLS CA cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.caCertFile }} - - name: CERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy.pem - - name: KEY_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-key.pem - - name: CACERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-ca-cert.pem - securityContext: - runAsNonRoot: false -{{- if and .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 12 }} -{{- end }} - volumeMounts: - - name: metrics-cert-dir-source - mountPath: /etc/source - readOnly: true - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - volumes: - - name: metrics-cert-dir-source - hostPath: - path: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - - name: metrics-cert-dir - emptyDir: {} - {{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-proxy-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-proxy-rbac.yaml deleted file mode 100644 index eefe609058..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-proxy-rbac.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.proxy.name" . }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.proxy.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- end }}{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-proxy.yaml deleted file mode 100644 index 723bbd6c00..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-proxy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} - pushprox-exporter: "proxy" -spec: - selector: - matchLabels: {{ include "pushProxy.proxy.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.proxy.labels" . | nindent 8 }} - spec: - securityContext: - runAsNonRoot: true - runAsUser: 1000 - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.proxy.nodeSelector }} -{{ toYaml .Values.proxy.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.proxy.tolerations }} -{{ toYaml .Values.proxy.tolerations | indent 8 }} -{{- end }} - serviceAccountName: {{ template "pushProxy.proxy.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-proxy - image: {{ template "system_default_registry" . }}{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag }} - command: - {{- range .Values.proxy.command }} - - {{ . | quote }} - {{- end }} - {{- if .Values.proxy.resources }} - resources: {{ toYaml .Values.proxy.resources | nindent 10 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - ports: - - name: pp-proxy - port: {{ required "Need .Values.proxy.port to configure proxy" .Values.proxy.port }} - protocol: TCP - targetPort: {{ .Values.proxy.port }} - selector: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-servicemonitor.yaml deleted file mode 100644 index 67eb2216b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/pushprox-servicemonitor.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.serviceMonitor }}{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "pushprox.serviceMonitor.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.serviceMonitor.labels" . | nindent 4 }} -spec: - endpoints: {{include "pushProxy.serviceMonitor.endpoints" . | nindent 4 }} - jobLabel: component - podTargetLabels: - - component - - pushprox-exporter - namespaceSelector: - matchNames: - - {{ template "pushprox.namespace" . }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} ---- -{{- $selector := "" }} -{{- if not (kindIs "invalid" .Values.service) }} -{{- if not (kindIs "invalid" .Values.service.selector) }} -{{ if .Values.service.selector }} -{{- if .Values.clients.enabled }} -{{- required (printf "Cannot override .Values.service.selector=%s when .Values.clients.enabled=true" (toJson .Values.service.selector)) "" }} -{{- end }} -{{- $selector = (toYaml .Values.service.selector) }} -{{- end }} -{{- end }} -{{- end }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - ports: - - name: metrics - port: {{ required "Need .Values.metricsPort to configure client to listen to metrics at port" .Values.metricsPort}} - protocol: TCP - targetPort: {{ .Values.metricsPort }} - selector: {{ default (include "pushProxy.client.labels" .) $selector | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/validate-install-crd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/validate-install-crd.yaml deleted file mode 100644 index 16abc2fa83..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/validate-install-crd.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -# {{- $found := dict -}} -# {{- set $found "monitoring.coreos.com/v1/ServiceMonitor" false -}} -# {{- range .Capabilities.APIVersions -}} -# {{- if hasKey $found (toString .) -}} -# {{- set $found (toString .) true -}} -# {{- end -}} -# {{- end -}} -# {{- range $_, $exists := $found -}} -# {{- if (eq $exists false) -}} -# {{- required "Required CRDs are missing. Please install Prometheus Operator CRDs before installing this chart." "" -}} -# {{- end -}} -# {{- end -}} -#{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/validate-psp-install.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/values.yaml deleted file mode 100644 index 1e076041b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rke2Scheduler/values.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# Default values for rancher-pushprox. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Default image containing both the proxy and the client was generated from the following Dockerfile -# https://github.com/prometheus-community/PushProx/blob/eeadbe766641699129920ccfaaaa30a85c67fe81/Dockerfile#L1-L15 - -# Configuration - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - seLinux: - enabled: false - -# A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. -# -# For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches -# any of the semver constraints provided as keys on the map. -# -# On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. -# -# If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. -# -# Notes: -# - On running a helm template, Helm generally assumes the kubeVersion is v1.20.0 -# - On running a helm install --dry-run, the correct kubeVersion should be chosen. -kubeVersionOverrides: [] -# - constraint: "< 1.21" -# values: -# metricsPort: 10252 -# clients: -# https: -# enabled: false -# insecureSkipVerify: false -# useServiceAccountCredentials: false - -namespaceOverride: "" - -# The component that is being monitored (i.e. etcd) -component: "component" - -# The port containing the metrics that need to be scraped -metricsPort: 2739 - -# Configure ServiceMonitor that monitors metrics from the metricsPort endpoint -serviceMonitor: - enabled: true - # A list of endpoints that will be added to the ServiceMonitor based on the Endpoint spec - # Source: https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint - # By default, proxyUrl and params._scheme will be overridden based on other values - endpoints: - - port: metrics - -# Configure Service that grabs scrape targets -service: - # The selector that is used to populate the Service's Endpoints object. - # The chart will error out on rendering templating if .Values.clients.enabled is set alongside this field, - # since it is expected that this service should point to the PushProx Clients Daemonset / Deployment - selector: {} - -clients: - enabled: true - # The port which the PushProx client will post PushProx metrics to - port: 9369 - # If unset, this will default to the URL for the proxy service: http://pushprox-{{component}}-proxy.{{namepsace}}.svc.cluster.local:{{proxy.port}} - # Should be modified if the clients are being deployed outside the cluster where the proxy rests, otherwise leave it null - proxyUrl: "" - # If set to true, the client will forward any requests from the host IP to 127.0.0.1 - # It will only allow proxy requests to the metricsPort specified - useLocalhost: false - # Configuration for accessing metrics via HTTPS - https: - # Does the client require https to access the metrics? - enabled: false - # Does the client require requests be sent to http or https? - forceHTTPSScheme: false - # If set to true, the client will create a service account with adequate permissions and set a flag - # on the client to use the service account token provided by it to make authorized scrape requests - useServiceAccountCredentials: false - # Configuration for authentication to metrics via https endpoint - authenticationMethod: - # Reads token from defined file in container - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenFile: - enabled: false - bearerTokenFilePath: "/var/run/secrets/kubernetes.io/serviceaccount/token" - # Reads token from defined secret in namespace - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenSecret: - enabled: false - # Reads token from defined secret in namespace - authorization: - enabled: false - type: "bearer" - credentials: - key: "token" - optional: false - # If set to true, the client will disable SSL security checks - insecureSkipVerify: false - # Directory on host where necessary TLS cert and key to scrape metrics can be found - certDir: "" - # Filenames for files located in .Values.clients.https.certDir that correspond to TLS settings - certFile: "" - keyFile: "" - caCertFile: "" - # seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. - # Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. - seLinuxOptions: {} - - metrics: - # Whether the client should publish PushProx client-specific metrics to .Values.clients.port - enabled: false - - rbac: - # Additional permissions to provide to the ServiceAccount bound to the client - # This can be used to provide additional permissions for the client to scrape metrics from the k8s API - # Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true - additionalRules: [] - - # Resource limits - resources: {} - - # Options to select all nodes to deploy client DaemonSet on - nodeSelector: {} - tolerations: [] - affinity: {} - - image: - repository: rancher/pushprox-client - tag: v0.1.3-rancher2-client - command: ["pushprox-client"] - - copyCertsImage: - repository: rancher/mirrored-library-busybox - tag: 1.31.1 - - # The default intention of rancher-pushprox clients is to scrape hostNetwork metrics across all nodes. - # This can be used to scrape internal Kubernetes components or DaemonSets of hostNetwork Pods in - # situations where a cloud provider firewall prevents Pod-To-Host communication but not Pod-To-Pod. - # However, if the underlying hostNetwork Pod that is being scraped is managed by a Deployment, - # this advanced option enables users to deploy the client as a Deployment instead of a DaemonSet. - # If a user deploys this feature and the underlying Deployment's number of replicas changes, the user will - # be responsible for upgrading this chart accordingly to the right number of replicas. - deployment: - enabled: false - replicas: 0 - -proxy: - enabled: true - # The port through which PushProx clients will communicate to the proxy - port: 8080 - - # Resource limits - resources: {} - - # Options to select a node to run a single proxy deployment on - nodeSelector: {} - tolerations: [] - - image: - repository: rancher/pushprox-proxy - tag: v0.1.3-rancher2-proxy - command: ["pushprox-proxy"] diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/Chart.yaml deleted file mode 100644 index 268a8c6967..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/Chart.yaml +++ /dev/null @@ -1,14 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.29.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-pushprox -apiVersion: v1 -appVersion: 0.1.0 -description: Sets up a deployment of the PushProx proxy and a DaemonSet of PushProx - clients. -name: rkeControllerManager -type: application -version: 0.2.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/README.md deleted file mode 100644 index 345002f48a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# rancher-pushprox - -A Rancher chart based on Rancher [PushProx](https://github.com/rancher/PushProx) that sets up a Deployment of a PushProx proxy and a DaemonSet of PushProx clients on a Kubernetes cluster. - -Installs [rancher-pushprox](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-pushprox) to create PushProx clients that can access their host's network and register with a PushProx proxy. A [Prometheus Operator](https://github.com/coreos/prometheus-operator) ServiceMonitor CR is also included that is configured to scrape the metrics from each of the clients through the proxy. - -Using an instance of this chart is suitable for the following scenarios: -- You need to scrape metrics from a port that should not be accessible outside of the host (e.g. scraping `etcd` metrics in a hardened cluster) -- You need to scrape metrics on a host that are not exposed outside of 127.0.0.1 (e.g. scraping `kube-proxy` metrics) -- You need to scrape metrics through HTTPS using certs hosted directly on `hostPath` -- You need to scrape metrics from Kubernetes components that require authorization via a service account (e.g. permissions to make request to `/metrics`) -- You need to scrape metrics without access to cacerts (i.e. enable `insecureSkipVerify`) - -The clients and proxy are created based on a Rancher fork of the [prometheus-community/PushProx](https://github.com/prometheus-community/PushProx) project. - -## Upgrading to Kubernetes v1.25+ - -Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. - -As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `global.cattle.psp.enabled` set to `false` if it has been previously set to `true`. -​ -> **Note:** -> In this chart release, any previous field that was associated with any PSP resources have been removed in favor of a single global field: `global.cattle.psp.enabled`. - -> **Note:** -> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** -> -> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. - -Upon setting `global.cattle.psp.enabled` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. - -As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. - -## Configuration - -The following tables list the configurable parameters of the rancher-pushprox chart and their default values. - -### General - -#### Required -| Parameter | Description | Example | -| ----- | ----------- | ------ | -| `component` | The component that is being monitored | `kube-etcd` -| `metricsPort` | The port on the host that contains the metrics you want to scrape (e.g. `http://:/metrics`) | `2379` | -| `namespaceOverride` | The namespace to install the chart | `""` - -#### Optional -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `serviceMonitor.enabled` | Deploys a [Prometheus Operator](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor) ServiceMonitor CR that is configured to scrape metrics on the hosts that the clients are deployed on via the proxy. Also deploys a Service that points to all pods with the expected client name that exposes the `metricsPort` selected | `true` | -| `serviceMonitor.endpoints` | A list of endpoints that will be added to the ServiceMonitor based on the [Endpoint spec](https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint) | `[{port: metrics}]` | -| `service.selector` | The selector that is used to populate the Service's Endpoints object. The chart will error out on rendering templating if `.Values.clients.enabled` is set alongside this field, since it is expected that this service should point to the PushProx Clients Daemonset / Deployment | `{}` | -| `clients.enabled` | Deploys a DaemonSet of clients that are each capable of scraping endpoints on the hostNetwork it is deployed on | `true` | -| `clients.port` | The port where the client will publish PushProx client-specific metrics. If deploying multiple clients onto the same node, the clients should not have conflicting ports | `9369` | -| `clients.proxyUrl` | Overrides the default proxyUrl setting of `http://pushprox-{{ .Values.component }}-proxy.{{ . Release.Namespace }}.svc.cluster.local:{{ .Values.proxy.port }}"` with the `proxyUrl` specified | `""` | -| `clients.useLocalhost` | Sets a flag on each client deployment to redirect scrapes directed to `HOST_IP` to `127.0.0.1` | `false` | -| `clients.https.enabled` | Enables scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.forceHTTPSScheme` | Forces scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.useServiceAccountCredentials` | If set to true, the client will create a service account with permissions to scrape `/metrics` endpoint of Kubernetes components. The client will use the service account token provided to make authorized scrape requests to the Kubernetes API | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.enabled` | If set to true, the client will use service account credentials mounted at the configured path `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath`. This requires permissions to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath` | This is a volume mount on the pod with permissions to scrape `/metrics` endpoint of Kubernetes components | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | -| `clients.https.authenticationMethod.bearerTokenSecret.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.authorization.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components | `false` | -| `clients.https.authenticationMethod.authorization.type` | If set, the client will use this type of authorization in its client requests for metrics | `"bearer"` | -| `clients.https.authenticationMethod.authorization.credentials.key` | If set, the client will use this key in the secret created by `clients.https.useServiceAccountCredentials` for authorization in its client requests for metrics | `"token"` | -| `clients.https.authenticationMethod.authorization.credentials.optional` | If set to false, the client will fail if the key in the secret created by `clients.https.useServiceAccountCredentials` does not exist | `false` | -| `clients.https.insecureSkipVerify` | If set to true, the client will disable SSL security checks | `false` | -| `clients.https.certDir` | A `hostPath` where TLS certs can be found. This path is mounted as a volume on an `initContainer` which copies only the necessary files over to an EmptyDir volume used by each client. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.certFile` | The path to the TLS cert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.keyFile` | The path to the TLS key file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.caCertFile` | The path to the TLS cacert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.seLinuxOptions` | seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. | `""` | -| `clients.metrics.enabled` | Whether the client should publish PushProx client-specific metrics. | `false` | -| `clients.rbac.additionalRules` | Additional permissions to provide to the ServiceAccount bound to the client. This can be used to provide additional permissions for the client to scrape metrics from the k8s API. Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true | `[]` | -| `clients.deployment.enabled` | Deploys the client as a Deployment (generally used if the underlying hostNetwork Pod that is being scraped is managed by a Deployment) | `false` | -| `clients.deployment.replicas` | The number of pods the Deployment has, it should match the number of pod the hostNetwork Deployment has. Required and only used if `client.deployment.enable` is set | `0` | -| `clients.deployment.affinity` | The affinity rules that allocate the pod to the node in which the hostNetwork Deployment's pods run. Required and only used if `client.deployment.enable` is set | `{}` | -| `clients.resources` | Set resource limits and requests for the client container | `{}` | -| `clients.nodeSelector` | Select which nodes to deploy the clients on | `{}` | -| `clients.tolerations` | Specify tolerations for clients | `[]` | -| `proxy.enabled` | Deploys the proxy that each client will register with | `true` | -| `proxy.port` | The port exposed by the proxy that each client will register with to allow metrics to be scraped from the host | `8080` | -| `proxy.resources` | Set resource limits and requests for the proxy container | `{}` | -| `proxy.nodeSelector` | Select which nodes the proxy can be deployed on | `{}` | -| `proxy.tolerations` | Specify tolerations (if necessary) to allow the proxy to be deployed on the selected node | `[]` | -| `kubeVersionOverrides` | A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches any of the semver constraints provided as keys on the map. On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. | `[]` - -*Tip: The filepaths set in `clients.https.File` can include wildcard characters*. - -See [rancher-monitoring](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-monitoring) for examples of how this chart can be used. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/_helpers.tpl deleted file mode 100644 index 8e651dccfd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/_helpers.tpl +++ /dev/null @@ -1,166 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# General - -{{- define "applyKubeVersionOverrides" -}} -{{- $overrides := dict -}} -{{- range $override := .Values.kubeVersionOverrides -}} -{{- if semverCompare $override.constraint $.Capabilities.KubeVersion.Version -}} -{{- $_ := mergeOverwrite $overrides $override.values -}} -{{- end -}} -{{- end -}} -{{- $_ := mergeOverwrite .Values $overrides -}} -{{- end -}} - -{{- define "pushprox.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{- define "pushProxy.commonLabels" -}} -release: {{ .Release.Name }} -component: {{ .Values.component | quote }} -provider: kubernetes -{{- end -}} - -{{- define "pushProxy.proxyUrl" -}} -{{- $_ := (required "Template requires either .Values.proxy.port or .Values.client.proxyUrl to set proxyUrl for client" (or .Values.clients.proxyUrl .Values.proxy.port)) -}} -{{- if .Values.clients.proxyUrl -}} -{{ printf "%s" .Values.clients.proxyUrl }} -{{- else -}} -{{ printf "http://%s.%s.svc:%d" (include "pushProxy.proxy.name" .) (include "pushprox.namespace" .) (int .Values.proxy.port) }} -{{- end -}}{{- end -}} - -# Client - -{{- define "pushProxy.client.name" -}} -{{- printf "pushprox-%s-client" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.serviceAccountTokenName" -}} -{{- printf "pushprox-%s-client-service-account-token" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.labels" -}} -k8s-app: {{ template "pushProxy.client.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# Proxy - -{{- define "pushProxy.proxy.name" -}} -{{- printf "pushprox-%s-proxy" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.proxy.labels" -}} -k8s-app: {{ template "pushProxy.proxy.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# ServiceMonitor - -{{- define "pushprox.serviceMonitor.name" -}} -{{- printf "%s-%s" .Release.Name (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.labels" -}} -app: {{ template "pushprox.serviceMonitor.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.endpoints" -}} -{{- $proxyURL := (include "pushProxy.proxyUrl" .) -}} -{{- $useHTTPS := .Values.clients.https.enabled -}} -{{- $forceHTTPSScheme := .Values.clients.https.forceHTTPSScheme -}} -{{- $insecureSkipVerify := .Values.clients.https.insecureSkipVerify -}} -{{- $useServiceAccountCredentials := .Values.clients.https.useServiceAccountCredentials -}} -{{- $serviceAccountTokenName := (include "pushProxy.client.serviceAccountTokenName" . ) -}} -{{- $metricRelabelings := list }} -{{- $endpoints := .Values.serviceMonitor.endpoints }} -{{- range $endpoints }} -{{- if $.Values.proxy.enabled }} -{{- $_ := set . "proxyUrl" $proxyURL }} -{{- end }} -{{- $clusterIdRelabel := dict }} -{{- if $.Values.global.cattle.clusterId }} -{{- $_ := set $clusterIdRelabel "action" "replace" }} -{{- $_ := set $clusterIdRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterIdRelabel "targetLabel" "cluster_id" }} -{{- $_ := set $clusterIdRelabel "replacement" $.Values.global.cattle.clusterId }} -{{- end }} -{{- $clusterNameRelabel := dict }} -{{- if $.Values.global.cattle.clusterName }} -{{- $_ := set $clusterNameRelabel "action" "replace" }} -{{- $_ := set $clusterNameRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterNameRelabel "targetLabel" "cluster_name" }} -{{- $_ := set $clusterNameRelabel "replacement" $.Values.global.cattle.clusterName }} -{{- end }} -{{- $metricRelabelings := gt (len (keys $clusterNameRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterNameRelabel)) ($metricRelabelings) }} -{{- $metricRelabelings := gt (len (keys $clusterIdRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterIdRelabel)) ($metricRelabelings) }} -{{- if not (empty $metricRelabelings) }} -{{- $_ := set . "metricRelabelings" ($metricRelabelings)}} -{{- end }} -{{- if $forceHTTPSScheme -}} -{{- $_ := set . "scheme" "https" }} -{{- end -}} -{{- if $useHTTPS -}} -{{- if (hasKey . "params") }} -{{- $_ := set (get . "params") "_scheme" (list "https") }} -{{- else }} -{{- $_ := set . "params" (dict "_scheme" (list "https")) }} -{{- end }} -{{- end }} -{{- if (hasKey . "tlsConfig") }} -{{- $_ := set (get . "tlsConfig") "insecureSkipVerify" $insecureSkipVerify }} -{{- else }} -{{- $_ := set . "tlsConfig" (dict "insecureSkipVerify" $insecureSkipVerify) }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenFile.enabled }} -{{- $_ := set . "bearerTokenFile" $.Values.clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenSecret.enabled }} -{{- $_ := set . "bearerTokenSecret" $serviceAccountTokenName }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.authorization.enabled }} -{{- if (hasKey . "authorization") }} -{{- $_ := set (get . "authorization") "type" $.Values.clients.https.authenticationMethod.authorization.type }} -{{- $_ := set (get . "authorization") "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional) }} -{{- else }} -{{- $_ := set . "authorization" (dict "type" $.Values.clients.https.authenticationMethod.authorization.type) }} -{{- $_ := set . "authorization" (dict "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional)) }} -{{- end }} -{{- end }} -{{- end }} -{{- toYaml $endpoints }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-clients-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-clients-rbac.yaml deleted file mode 100644 index a8e27c3735..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-clients-rbac.yaml +++ /dev/null @@ -1,97 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.client.name" . }} -{{- end }} -{{- if and .Values.clients.https.enabled .Values.clients.https.useServiceAccountCredentials }} -- nonResourceURLs: ["/metrics"] - verbs: ["get"] -{{- if .Values.clients.rbac.additionalRules }} -{{ toYaml .Values.clients.rbac.additionalRules }} -{{- end }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.client.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} ---- -{{- if .Values.clients.https.useServiceAccountCredentials }} -apiVersion: v1 -kind: Secret -type: kubernetes.io/service-account-token -metadata: - name: {{ template "pushProxy.client.serviceAccountTokenName" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - annotations: - kubernetes.io/service-account.name: {{ template "pushProxy.client.name" . }} -{{- end }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: true - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 6 }} -{{- end }} - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - - 'emptyDir' - - 'hostPath' - allowedHostPaths: - - pathPrefix: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - readOnly: true -{{- end }} -{{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-clients.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-clients.yaml deleted file mode 100644 index e8fcfb3883..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-clients.yaml +++ /dev/null @@ -1,157 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: apps/v1 -{{- if .Values.clients.deployment.enabled }} -kind: Deployment -{{- else }} -kind: DaemonSet -{{- end }} -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - pushprox-exporter: "client" -spec: - {{- if .Values.clients.deployment.enabled }} - replicas: {{ .Values.clients.deployment.replicas }} - {{- end }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.client.labels" . | nindent 8 }} - spec: - {{- if .Values.clients.affinity }} - affinity: {{ toYaml .Values.clients.affinity | nindent 8 }} - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.clients.nodeSelector }} -{{ toYaml .Values.clients.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.clients.tolerations }} -{{ toYaml .Values.clients.tolerations | indent 8 }} -{{- end }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - serviceAccountName: {{ template "pushProxy.client.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-client - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - {{- range .Values.clients.command }} - - {{ . | quote }} - {{- end }} - args: - - --fqdn=$(HOST_IP) - - --proxy-url=$(PROXY_URL) - {{- if .Values.clients.metrics.enabled }} - - --metrics-addr=$(PORT) - {{- end }} - - --allow-port={{ required "Need .Values.metricsPort to configure client to be allowed to scrape metrics at port" .Values.metricsPort}} - {{- if .Values.clients.useLocalhost }} - - --use-localhost - {{- end }} - {{- if .Values.clients.https.enabled }} - {{- if .Values.clients.https.insecureSkipVerify }} - - --insecure-skip-verify - {{- end }} - {{- if .Values.clients.https.useServiceAccountCredentials }} - - --token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- end }} - {{- if .Values.clients.https.certDir }} - - --tls.cert=/etc/ssl/push-proxy/push-proxy.pem - - --tls.key=/etc/ssl/push-proxy/push-proxy-key.pem - - --tls.cacert=/etc/ssl/push-proxy/push-proxy-ca-cert.pem - {{- end }} - {{- end }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if .Values.clients.metrics.enabled }} - - name: PORT - value: :{{ .Values.clients.port }} - {{- end }} - - name: PROXY_URL - value: {{ template "pushProxy.proxyUrl" . }} - securityContext: - runAsNonRoot: true - runAsUser: 1000 - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - volumeMounts: - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - {{- end }} - {{- if .Values.clients.resources }} - resources: {{ toYaml .Values.clients.resources | nindent 10 }} - {{- end }} - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - initContainers: - - name: copy-certs - image: {{ template "system_default_registry" . }}{{ .Values.clients.copyCertsImage.repository }}:{{ .Values.clients.copyCertsImage.tag }} - command: - - sh - - -c - - | - echo "Searching for files to copy within the source volume" - echo "cert: ${CERT_FILE_NAME}" - echo "key: ${KEY_FILE_NAME}" - echo "cacert: ${CACERT_FILE_NAME}" - - CERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CERT_FILE_NAME}" | sort -r | head -n 1) - KEY_FILE_SOURCE=$(find /etc/source/ -type f -name "${KEY_FILE_NAME}" | sort -r | head -n 1) - CACERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CACERT_FILE_NAME}" | sort -r | head -n 1) - - test -z ${CERT_FILE_SOURCE} && echo "Failed to find cert file" && exit 1 - test -z ${KEY_FILE_SOURCE} && echo "Failed to find key file" && exit 1 - test -z ${CACERT_FILE_SOURCE} && echo "Failed to find cacert file" && exit 1 - - echo "Copying cert file from $CERT_FILE_SOURCE to $CERT_FILE_TARGET" - cp $CERT_FILE_SOURCE $CERT_FILE_TARGET || exit 1 - chmod 444 $CERT_FILE_TARGET || exit 1 - - echo "Copying key file from $KEY_FILE_SOURCE to $KEY_FILE_TARGET" - cp $KEY_FILE_SOURCE $KEY_FILE_TARGET || exit 1 - chmod 444 $KEY_FILE_TARGET || exit 1 - - echo "Copying cacert file from $CACERT_FILE_SOURCE to $CACERT_FILE_TARGET" - cp $CACERT_FILE_SOURCE $CACERT_FILE_TARGET || exit 1 - chmod 444 $CACERT_FILE_TARGET || exit 1 - env: - - name: CERT_FILE_NAME - value: {{ required "Need a TLS cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.certFile }} - - name: KEY_FILE_NAME - value: {{ required "Need a TLS key file for scraping metrics endpoint over HTTPs" .Values.clients.https.keyFile }} - - name: CACERT_FILE_NAME - value: {{ required "Need a TLS CA cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.caCertFile }} - - name: CERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy.pem - - name: KEY_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-key.pem - - name: CACERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-ca-cert.pem - securityContext: - runAsNonRoot: false -{{- if and .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 12 }} -{{- end }} - volumeMounts: - - name: metrics-cert-dir-source - mountPath: /etc/source - readOnly: true - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - volumes: - - name: metrics-cert-dir-source - hostPath: - path: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - - name: metrics-cert-dir - emptyDir: {} - {{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-proxy-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-proxy-rbac.yaml deleted file mode 100644 index eefe609058..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-proxy-rbac.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.proxy.name" . }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.proxy.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- end }}{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-proxy.yaml deleted file mode 100644 index 723bbd6c00..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-proxy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} - pushprox-exporter: "proxy" -spec: - selector: - matchLabels: {{ include "pushProxy.proxy.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.proxy.labels" . | nindent 8 }} - spec: - securityContext: - runAsNonRoot: true - runAsUser: 1000 - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.proxy.nodeSelector }} -{{ toYaml .Values.proxy.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.proxy.tolerations }} -{{ toYaml .Values.proxy.tolerations | indent 8 }} -{{- end }} - serviceAccountName: {{ template "pushProxy.proxy.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-proxy - image: {{ template "system_default_registry" . }}{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag }} - command: - {{- range .Values.proxy.command }} - - {{ . | quote }} - {{- end }} - {{- if .Values.proxy.resources }} - resources: {{ toYaml .Values.proxy.resources | nindent 10 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - ports: - - name: pp-proxy - port: {{ required "Need .Values.proxy.port to configure proxy" .Values.proxy.port }} - protocol: TCP - targetPort: {{ .Values.proxy.port }} - selector: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-servicemonitor.yaml deleted file mode 100644 index 67eb2216b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/pushprox-servicemonitor.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.serviceMonitor }}{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "pushprox.serviceMonitor.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.serviceMonitor.labels" . | nindent 4 }} -spec: - endpoints: {{include "pushProxy.serviceMonitor.endpoints" . | nindent 4 }} - jobLabel: component - podTargetLabels: - - component - - pushprox-exporter - namespaceSelector: - matchNames: - - {{ template "pushprox.namespace" . }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} ---- -{{- $selector := "" }} -{{- if not (kindIs "invalid" .Values.service) }} -{{- if not (kindIs "invalid" .Values.service.selector) }} -{{ if .Values.service.selector }} -{{- if .Values.clients.enabled }} -{{- required (printf "Cannot override .Values.service.selector=%s when .Values.clients.enabled=true" (toJson .Values.service.selector)) "" }} -{{- end }} -{{- $selector = (toYaml .Values.service.selector) }} -{{- end }} -{{- end }} -{{- end }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - ports: - - name: metrics - port: {{ required "Need .Values.metricsPort to configure client to listen to metrics at port" .Values.metricsPort}} - protocol: TCP - targetPort: {{ .Values.metricsPort }} - selector: {{ default (include "pushProxy.client.labels" .) $selector | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/validate-install-crd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/validate-install-crd.yaml deleted file mode 100644 index 16abc2fa83..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/validate-install-crd.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -# {{- $found := dict -}} -# {{- set $found "monitoring.coreos.com/v1/ServiceMonitor" false -}} -# {{- range .Capabilities.APIVersions -}} -# {{- if hasKey $found (toString .) -}} -# {{- set $found (toString .) true -}} -# {{- end -}} -# {{- end -}} -# {{- range $_, $exists := $found -}} -# {{- if (eq $exists false) -}} -# {{- required "Required CRDs are missing. Please install Prometheus Operator CRDs before installing this chart." "" -}} -# {{- end -}} -# {{- end -}} -#{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/validate-psp-install.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/values.yaml deleted file mode 100644 index 1e076041b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeControllerManager/values.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# Default values for rancher-pushprox. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Default image containing both the proxy and the client was generated from the following Dockerfile -# https://github.com/prometheus-community/PushProx/blob/eeadbe766641699129920ccfaaaa30a85c67fe81/Dockerfile#L1-L15 - -# Configuration - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - seLinux: - enabled: false - -# A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. -# -# For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches -# any of the semver constraints provided as keys on the map. -# -# On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. -# -# If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. -# -# Notes: -# - On running a helm template, Helm generally assumes the kubeVersion is v1.20.0 -# - On running a helm install --dry-run, the correct kubeVersion should be chosen. -kubeVersionOverrides: [] -# - constraint: "< 1.21" -# values: -# metricsPort: 10252 -# clients: -# https: -# enabled: false -# insecureSkipVerify: false -# useServiceAccountCredentials: false - -namespaceOverride: "" - -# The component that is being monitored (i.e. etcd) -component: "component" - -# The port containing the metrics that need to be scraped -metricsPort: 2739 - -# Configure ServiceMonitor that monitors metrics from the metricsPort endpoint -serviceMonitor: - enabled: true - # A list of endpoints that will be added to the ServiceMonitor based on the Endpoint spec - # Source: https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint - # By default, proxyUrl and params._scheme will be overridden based on other values - endpoints: - - port: metrics - -# Configure Service that grabs scrape targets -service: - # The selector that is used to populate the Service's Endpoints object. - # The chart will error out on rendering templating if .Values.clients.enabled is set alongside this field, - # since it is expected that this service should point to the PushProx Clients Daemonset / Deployment - selector: {} - -clients: - enabled: true - # The port which the PushProx client will post PushProx metrics to - port: 9369 - # If unset, this will default to the URL for the proxy service: http://pushprox-{{component}}-proxy.{{namepsace}}.svc.cluster.local:{{proxy.port}} - # Should be modified if the clients are being deployed outside the cluster where the proxy rests, otherwise leave it null - proxyUrl: "" - # If set to true, the client will forward any requests from the host IP to 127.0.0.1 - # It will only allow proxy requests to the metricsPort specified - useLocalhost: false - # Configuration for accessing metrics via HTTPS - https: - # Does the client require https to access the metrics? - enabled: false - # Does the client require requests be sent to http or https? - forceHTTPSScheme: false - # If set to true, the client will create a service account with adequate permissions and set a flag - # on the client to use the service account token provided by it to make authorized scrape requests - useServiceAccountCredentials: false - # Configuration for authentication to metrics via https endpoint - authenticationMethod: - # Reads token from defined file in container - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenFile: - enabled: false - bearerTokenFilePath: "/var/run/secrets/kubernetes.io/serviceaccount/token" - # Reads token from defined secret in namespace - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenSecret: - enabled: false - # Reads token from defined secret in namespace - authorization: - enabled: false - type: "bearer" - credentials: - key: "token" - optional: false - # If set to true, the client will disable SSL security checks - insecureSkipVerify: false - # Directory on host where necessary TLS cert and key to scrape metrics can be found - certDir: "" - # Filenames for files located in .Values.clients.https.certDir that correspond to TLS settings - certFile: "" - keyFile: "" - caCertFile: "" - # seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. - # Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. - seLinuxOptions: {} - - metrics: - # Whether the client should publish PushProx client-specific metrics to .Values.clients.port - enabled: false - - rbac: - # Additional permissions to provide to the ServiceAccount bound to the client - # This can be used to provide additional permissions for the client to scrape metrics from the k8s API - # Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true - additionalRules: [] - - # Resource limits - resources: {} - - # Options to select all nodes to deploy client DaemonSet on - nodeSelector: {} - tolerations: [] - affinity: {} - - image: - repository: rancher/pushprox-client - tag: v0.1.3-rancher2-client - command: ["pushprox-client"] - - copyCertsImage: - repository: rancher/mirrored-library-busybox - tag: 1.31.1 - - # The default intention of rancher-pushprox clients is to scrape hostNetwork metrics across all nodes. - # This can be used to scrape internal Kubernetes components or DaemonSets of hostNetwork Pods in - # situations where a cloud provider firewall prevents Pod-To-Host communication but not Pod-To-Pod. - # However, if the underlying hostNetwork Pod that is being scraped is managed by a Deployment, - # this advanced option enables users to deploy the client as a Deployment instead of a DaemonSet. - # If a user deploys this feature and the underlying Deployment's number of replicas changes, the user will - # be responsible for upgrading this chart accordingly to the right number of replicas. - deployment: - enabled: false - replicas: 0 - -proxy: - enabled: true - # The port through which PushProx clients will communicate to the proxy - port: 8080 - - # Resource limits - resources: {} - - # Options to select a node to run a single proxy deployment on - nodeSelector: {} - tolerations: [] - - image: - repository: rancher/pushprox-proxy - tag: v0.1.3-rancher2-proxy - command: ["pushprox-proxy"] diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/Chart.yaml deleted file mode 100644 index c2c7c61f33..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/Chart.yaml +++ /dev/null @@ -1,14 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.29.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-pushprox -apiVersion: v1 -appVersion: 0.1.0 -description: Sets up a deployment of the PushProx proxy and a DaemonSet of PushProx - clients. -name: rkeEtcd -type: application -version: 0.2.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/README.md deleted file mode 100644 index 345002f48a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# rancher-pushprox - -A Rancher chart based on Rancher [PushProx](https://github.com/rancher/PushProx) that sets up a Deployment of a PushProx proxy and a DaemonSet of PushProx clients on a Kubernetes cluster. - -Installs [rancher-pushprox](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-pushprox) to create PushProx clients that can access their host's network and register with a PushProx proxy. A [Prometheus Operator](https://github.com/coreos/prometheus-operator) ServiceMonitor CR is also included that is configured to scrape the metrics from each of the clients through the proxy. - -Using an instance of this chart is suitable for the following scenarios: -- You need to scrape metrics from a port that should not be accessible outside of the host (e.g. scraping `etcd` metrics in a hardened cluster) -- You need to scrape metrics on a host that are not exposed outside of 127.0.0.1 (e.g. scraping `kube-proxy` metrics) -- You need to scrape metrics through HTTPS using certs hosted directly on `hostPath` -- You need to scrape metrics from Kubernetes components that require authorization via a service account (e.g. permissions to make request to `/metrics`) -- You need to scrape metrics without access to cacerts (i.e. enable `insecureSkipVerify`) - -The clients and proxy are created based on a Rancher fork of the [prometheus-community/PushProx](https://github.com/prometheus-community/PushProx) project. - -## Upgrading to Kubernetes v1.25+ - -Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. - -As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `global.cattle.psp.enabled` set to `false` if it has been previously set to `true`. -​ -> **Note:** -> In this chart release, any previous field that was associated with any PSP resources have been removed in favor of a single global field: `global.cattle.psp.enabled`. - -> **Note:** -> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** -> -> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. - -Upon setting `global.cattle.psp.enabled` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. - -As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. - -## Configuration - -The following tables list the configurable parameters of the rancher-pushprox chart and their default values. - -### General - -#### Required -| Parameter | Description | Example | -| ----- | ----------- | ------ | -| `component` | The component that is being monitored | `kube-etcd` -| `metricsPort` | The port on the host that contains the metrics you want to scrape (e.g. `http://:/metrics`) | `2379` | -| `namespaceOverride` | The namespace to install the chart | `""` - -#### Optional -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `serviceMonitor.enabled` | Deploys a [Prometheus Operator](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor) ServiceMonitor CR that is configured to scrape metrics on the hosts that the clients are deployed on via the proxy. Also deploys a Service that points to all pods with the expected client name that exposes the `metricsPort` selected | `true` | -| `serviceMonitor.endpoints` | A list of endpoints that will be added to the ServiceMonitor based on the [Endpoint spec](https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint) | `[{port: metrics}]` | -| `service.selector` | The selector that is used to populate the Service's Endpoints object. The chart will error out on rendering templating if `.Values.clients.enabled` is set alongside this field, since it is expected that this service should point to the PushProx Clients Daemonset / Deployment | `{}` | -| `clients.enabled` | Deploys a DaemonSet of clients that are each capable of scraping endpoints on the hostNetwork it is deployed on | `true` | -| `clients.port` | The port where the client will publish PushProx client-specific metrics. If deploying multiple clients onto the same node, the clients should not have conflicting ports | `9369` | -| `clients.proxyUrl` | Overrides the default proxyUrl setting of `http://pushprox-{{ .Values.component }}-proxy.{{ . Release.Namespace }}.svc.cluster.local:{{ .Values.proxy.port }}"` with the `proxyUrl` specified | `""` | -| `clients.useLocalhost` | Sets a flag on each client deployment to redirect scrapes directed to `HOST_IP` to `127.0.0.1` | `false` | -| `clients.https.enabled` | Enables scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.forceHTTPSScheme` | Forces scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.useServiceAccountCredentials` | If set to true, the client will create a service account with permissions to scrape `/metrics` endpoint of Kubernetes components. The client will use the service account token provided to make authorized scrape requests to the Kubernetes API | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.enabled` | If set to true, the client will use service account credentials mounted at the configured path `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath`. This requires permissions to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath` | This is a volume mount on the pod with permissions to scrape `/metrics` endpoint of Kubernetes components | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | -| `clients.https.authenticationMethod.bearerTokenSecret.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.authorization.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components | `false` | -| `clients.https.authenticationMethod.authorization.type` | If set, the client will use this type of authorization in its client requests for metrics | `"bearer"` | -| `clients.https.authenticationMethod.authorization.credentials.key` | If set, the client will use this key in the secret created by `clients.https.useServiceAccountCredentials` for authorization in its client requests for metrics | `"token"` | -| `clients.https.authenticationMethod.authorization.credentials.optional` | If set to false, the client will fail if the key in the secret created by `clients.https.useServiceAccountCredentials` does not exist | `false` | -| `clients.https.insecureSkipVerify` | If set to true, the client will disable SSL security checks | `false` | -| `clients.https.certDir` | A `hostPath` where TLS certs can be found. This path is mounted as a volume on an `initContainer` which copies only the necessary files over to an EmptyDir volume used by each client. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.certFile` | The path to the TLS cert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.keyFile` | The path to the TLS key file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.caCertFile` | The path to the TLS cacert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.seLinuxOptions` | seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. | `""` | -| `clients.metrics.enabled` | Whether the client should publish PushProx client-specific metrics. | `false` | -| `clients.rbac.additionalRules` | Additional permissions to provide to the ServiceAccount bound to the client. This can be used to provide additional permissions for the client to scrape metrics from the k8s API. Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true | `[]` | -| `clients.deployment.enabled` | Deploys the client as a Deployment (generally used if the underlying hostNetwork Pod that is being scraped is managed by a Deployment) | `false` | -| `clients.deployment.replicas` | The number of pods the Deployment has, it should match the number of pod the hostNetwork Deployment has. Required and only used if `client.deployment.enable` is set | `0` | -| `clients.deployment.affinity` | The affinity rules that allocate the pod to the node in which the hostNetwork Deployment's pods run. Required and only used if `client.deployment.enable` is set | `{}` | -| `clients.resources` | Set resource limits and requests for the client container | `{}` | -| `clients.nodeSelector` | Select which nodes to deploy the clients on | `{}` | -| `clients.tolerations` | Specify tolerations for clients | `[]` | -| `proxy.enabled` | Deploys the proxy that each client will register with | `true` | -| `proxy.port` | The port exposed by the proxy that each client will register with to allow metrics to be scraped from the host | `8080` | -| `proxy.resources` | Set resource limits and requests for the proxy container | `{}` | -| `proxy.nodeSelector` | Select which nodes the proxy can be deployed on | `{}` | -| `proxy.tolerations` | Specify tolerations (if necessary) to allow the proxy to be deployed on the selected node | `[]` | -| `kubeVersionOverrides` | A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches any of the semver constraints provided as keys on the map. On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. | `[]` - -*Tip: The filepaths set in `clients.https.File` can include wildcard characters*. - -See [rancher-monitoring](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-monitoring) for examples of how this chart can be used. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/_helpers.tpl deleted file mode 100644 index 8e651dccfd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/_helpers.tpl +++ /dev/null @@ -1,166 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# General - -{{- define "applyKubeVersionOverrides" -}} -{{- $overrides := dict -}} -{{- range $override := .Values.kubeVersionOverrides -}} -{{- if semverCompare $override.constraint $.Capabilities.KubeVersion.Version -}} -{{- $_ := mergeOverwrite $overrides $override.values -}} -{{- end -}} -{{- end -}} -{{- $_ := mergeOverwrite .Values $overrides -}} -{{- end -}} - -{{- define "pushprox.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{- define "pushProxy.commonLabels" -}} -release: {{ .Release.Name }} -component: {{ .Values.component | quote }} -provider: kubernetes -{{- end -}} - -{{- define "pushProxy.proxyUrl" -}} -{{- $_ := (required "Template requires either .Values.proxy.port or .Values.client.proxyUrl to set proxyUrl for client" (or .Values.clients.proxyUrl .Values.proxy.port)) -}} -{{- if .Values.clients.proxyUrl -}} -{{ printf "%s" .Values.clients.proxyUrl }} -{{- else -}} -{{ printf "http://%s.%s.svc:%d" (include "pushProxy.proxy.name" .) (include "pushprox.namespace" .) (int .Values.proxy.port) }} -{{- end -}}{{- end -}} - -# Client - -{{- define "pushProxy.client.name" -}} -{{- printf "pushprox-%s-client" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.serviceAccountTokenName" -}} -{{- printf "pushprox-%s-client-service-account-token" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.labels" -}} -k8s-app: {{ template "pushProxy.client.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# Proxy - -{{- define "pushProxy.proxy.name" -}} -{{- printf "pushprox-%s-proxy" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.proxy.labels" -}} -k8s-app: {{ template "pushProxy.proxy.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# ServiceMonitor - -{{- define "pushprox.serviceMonitor.name" -}} -{{- printf "%s-%s" .Release.Name (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.labels" -}} -app: {{ template "pushprox.serviceMonitor.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.endpoints" -}} -{{- $proxyURL := (include "pushProxy.proxyUrl" .) -}} -{{- $useHTTPS := .Values.clients.https.enabled -}} -{{- $forceHTTPSScheme := .Values.clients.https.forceHTTPSScheme -}} -{{- $insecureSkipVerify := .Values.clients.https.insecureSkipVerify -}} -{{- $useServiceAccountCredentials := .Values.clients.https.useServiceAccountCredentials -}} -{{- $serviceAccountTokenName := (include "pushProxy.client.serviceAccountTokenName" . ) -}} -{{- $metricRelabelings := list }} -{{- $endpoints := .Values.serviceMonitor.endpoints }} -{{- range $endpoints }} -{{- if $.Values.proxy.enabled }} -{{- $_ := set . "proxyUrl" $proxyURL }} -{{- end }} -{{- $clusterIdRelabel := dict }} -{{- if $.Values.global.cattle.clusterId }} -{{- $_ := set $clusterIdRelabel "action" "replace" }} -{{- $_ := set $clusterIdRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterIdRelabel "targetLabel" "cluster_id" }} -{{- $_ := set $clusterIdRelabel "replacement" $.Values.global.cattle.clusterId }} -{{- end }} -{{- $clusterNameRelabel := dict }} -{{- if $.Values.global.cattle.clusterName }} -{{- $_ := set $clusterNameRelabel "action" "replace" }} -{{- $_ := set $clusterNameRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterNameRelabel "targetLabel" "cluster_name" }} -{{- $_ := set $clusterNameRelabel "replacement" $.Values.global.cattle.clusterName }} -{{- end }} -{{- $metricRelabelings := gt (len (keys $clusterNameRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterNameRelabel)) ($metricRelabelings) }} -{{- $metricRelabelings := gt (len (keys $clusterIdRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterIdRelabel)) ($metricRelabelings) }} -{{- if not (empty $metricRelabelings) }} -{{- $_ := set . "metricRelabelings" ($metricRelabelings)}} -{{- end }} -{{- if $forceHTTPSScheme -}} -{{- $_ := set . "scheme" "https" }} -{{- end -}} -{{- if $useHTTPS -}} -{{- if (hasKey . "params") }} -{{- $_ := set (get . "params") "_scheme" (list "https") }} -{{- else }} -{{- $_ := set . "params" (dict "_scheme" (list "https")) }} -{{- end }} -{{- end }} -{{- if (hasKey . "tlsConfig") }} -{{- $_ := set (get . "tlsConfig") "insecureSkipVerify" $insecureSkipVerify }} -{{- else }} -{{- $_ := set . "tlsConfig" (dict "insecureSkipVerify" $insecureSkipVerify) }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenFile.enabled }} -{{- $_ := set . "bearerTokenFile" $.Values.clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenSecret.enabled }} -{{- $_ := set . "bearerTokenSecret" $serviceAccountTokenName }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.authorization.enabled }} -{{- if (hasKey . "authorization") }} -{{- $_ := set (get . "authorization") "type" $.Values.clients.https.authenticationMethod.authorization.type }} -{{- $_ := set (get . "authorization") "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional) }} -{{- else }} -{{- $_ := set . "authorization" (dict "type" $.Values.clients.https.authenticationMethod.authorization.type) }} -{{- $_ := set . "authorization" (dict "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional)) }} -{{- end }} -{{- end }} -{{- end }} -{{- toYaml $endpoints }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-clients-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-clients-rbac.yaml deleted file mode 100644 index a8e27c3735..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-clients-rbac.yaml +++ /dev/null @@ -1,97 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.client.name" . }} -{{- end }} -{{- if and .Values.clients.https.enabled .Values.clients.https.useServiceAccountCredentials }} -- nonResourceURLs: ["/metrics"] - verbs: ["get"] -{{- if .Values.clients.rbac.additionalRules }} -{{ toYaml .Values.clients.rbac.additionalRules }} -{{- end }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.client.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} ---- -{{- if .Values.clients.https.useServiceAccountCredentials }} -apiVersion: v1 -kind: Secret -type: kubernetes.io/service-account-token -metadata: - name: {{ template "pushProxy.client.serviceAccountTokenName" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - annotations: - kubernetes.io/service-account.name: {{ template "pushProxy.client.name" . }} -{{- end }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: true - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 6 }} -{{- end }} - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - - 'emptyDir' - - 'hostPath' - allowedHostPaths: - - pathPrefix: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - readOnly: true -{{- end }} -{{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-clients.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-clients.yaml deleted file mode 100644 index e8fcfb3883..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-clients.yaml +++ /dev/null @@ -1,157 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: apps/v1 -{{- if .Values.clients.deployment.enabled }} -kind: Deployment -{{- else }} -kind: DaemonSet -{{- end }} -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - pushprox-exporter: "client" -spec: - {{- if .Values.clients.deployment.enabled }} - replicas: {{ .Values.clients.deployment.replicas }} - {{- end }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.client.labels" . | nindent 8 }} - spec: - {{- if .Values.clients.affinity }} - affinity: {{ toYaml .Values.clients.affinity | nindent 8 }} - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.clients.nodeSelector }} -{{ toYaml .Values.clients.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.clients.tolerations }} -{{ toYaml .Values.clients.tolerations | indent 8 }} -{{- end }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - serviceAccountName: {{ template "pushProxy.client.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-client - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - {{- range .Values.clients.command }} - - {{ . | quote }} - {{- end }} - args: - - --fqdn=$(HOST_IP) - - --proxy-url=$(PROXY_URL) - {{- if .Values.clients.metrics.enabled }} - - --metrics-addr=$(PORT) - {{- end }} - - --allow-port={{ required "Need .Values.metricsPort to configure client to be allowed to scrape metrics at port" .Values.metricsPort}} - {{- if .Values.clients.useLocalhost }} - - --use-localhost - {{- end }} - {{- if .Values.clients.https.enabled }} - {{- if .Values.clients.https.insecureSkipVerify }} - - --insecure-skip-verify - {{- end }} - {{- if .Values.clients.https.useServiceAccountCredentials }} - - --token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- end }} - {{- if .Values.clients.https.certDir }} - - --tls.cert=/etc/ssl/push-proxy/push-proxy.pem - - --tls.key=/etc/ssl/push-proxy/push-proxy-key.pem - - --tls.cacert=/etc/ssl/push-proxy/push-proxy-ca-cert.pem - {{- end }} - {{- end }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if .Values.clients.metrics.enabled }} - - name: PORT - value: :{{ .Values.clients.port }} - {{- end }} - - name: PROXY_URL - value: {{ template "pushProxy.proxyUrl" . }} - securityContext: - runAsNonRoot: true - runAsUser: 1000 - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - volumeMounts: - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - {{- end }} - {{- if .Values.clients.resources }} - resources: {{ toYaml .Values.clients.resources | nindent 10 }} - {{- end }} - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - initContainers: - - name: copy-certs - image: {{ template "system_default_registry" . }}{{ .Values.clients.copyCertsImage.repository }}:{{ .Values.clients.copyCertsImage.tag }} - command: - - sh - - -c - - | - echo "Searching for files to copy within the source volume" - echo "cert: ${CERT_FILE_NAME}" - echo "key: ${KEY_FILE_NAME}" - echo "cacert: ${CACERT_FILE_NAME}" - - CERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CERT_FILE_NAME}" | sort -r | head -n 1) - KEY_FILE_SOURCE=$(find /etc/source/ -type f -name "${KEY_FILE_NAME}" | sort -r | head -n 1) - CACERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CACERT_FILE_NAME}" | sort -r | head -n 1) - - test -z ${CERT_FILE_SOURCE} && echo "Failed to find cert file" && exit 1 - test -z ${KEY_FILE_SOURCE} && echo "Failed to find key file" && exit 1 - test -z ${CACERT_FILE_SOURCE} && echo "Failed to find cacert file" && exit 1 - - echo "Copying cert file from $CERT_FILE_SOURCE to $CERT_FILE_TARGET" - cp $CERT_FILE_SOURCE $CERT_FILE_TARGET || exit 1 - chmod 444 $CERT_FILE_TARGET || exit 1 - - echo "Copying key file from $KEY_FILE_SOURCE to $KEY_FILE_TARGET" - cp $KEY_FILE_SOURCE $KEY_FILE_TARGET || exit 1 - chmod 444 $KEY_FILE_TARGET || exit 1 - - echo "Copying cacert file from $CACERT_FILE_SOURCE to $CACERT_FILE_TARGET" - cp $CACERT_FILE_SOURCE $CACERT_FILE_TARGET || exit 1 - chmod 444 $CACERT_FILE_TARGET || exit 1 - env: - - name: CERT_FILE_NAME - value: {{ required "Need a TLS cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.certFile }} - - name: KEY_FILE_NAME - value: {{ required "Need a TLS key file for scraping metrics endpoint over HTTPs" .Values.clients.https.keyFile }} - - name: CACERT_FILE_NAME - value: {{ required "Need a TLS CA cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.caCertFile }} - - name: CERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy.pem - - name: KEY_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-key.pem - - name: CACERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-ca-cert.pem - securityContext: - runAsNonRoot: false -{{- if and .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 12 }} -{{- end }} - volumeMounts: - - name: metrics-cert-dir-source - mountPath: /etc/source - readOnly: true - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - volumes: - - name: metrics-cert-dir-source - hostPath: - path: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - - name: metrics-cert-dir - emptyDir: {} - {{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-proxy-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-proxy-rbac.yaml deleted file mode 100644 index eefe609058..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-proxy-rbac.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.proxy.name" . }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.proxy.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- end }}{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-proxy.yaml deleted file mode 100644 index 723bbd6c00..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-proxy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} - pushprox-exporter: "proxy" -spec: - selector: - matchLabels: {{ include "pushProxy.proxy.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.proxy.labels" . | nindent 8 }} - spec: - securityContext: - runAsNonRoot: true - runAsUser: 1000 - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.proxy.nodeSelector }} -{{ toYaml .Values.proxy.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.proxy.tolerations }} -{{ toYaml .Values.proxy.tolerations | indent 8 }} -{{- end }} - serviceAccountName: {{ template "pushProxy.proxy.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-proxy - image: {{ template "system_default_registry" . }}{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag }} - command: - {{- range .Values.proxy.command }} - - {{ . | quote }} - {{- end }} - {{- if .Values.proxy.resources }} - resources: {{ toYaml .Values.proxy.resources | nindent 10 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - ports: - - name: pp-proxy - port: {{ required "Need .Values.proxy.port to configure proxy" .Values.proxy.port }} - protocol: TCP - targetPort: {{ .Values.proxy.port }} - selector: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-servicemonitor.yaml deleted file mode 100644 index 67eb2216b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/pushprox-servicemonitor.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.serviceMonitor }}{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "pushprox.serviceMonitor.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.serviceMonitor.labels" . | nindent 4 }} -spec: - endpoints: {{include "pushProxy.serviceMonitor.endpoints" . | nindent 4 }} - jobLabel: component - podTargetLabels: - - component - - pushprox-exporter - namespaceSelector: - matchNames: - - {{ template "pushprox.namespace" . }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} ---- -{{- $selector := "" }} -{{- if not (kindIs "invalid" .Values.service) }} -{{- if not (kindIs "invalid" .Values.service.selector) }} -{{ if .Values.service.selector }} -{{- if .Values.clients.enabled }} -{{- required (printf "Cannot override .Values.service.selector=%s when .Values.clients.enabled=true" (toJson .Values.service.selector)) "" }} -{{- end }} -{{- $selector = (toYaml .Values.service.selector) }} -{{- end }} -{{- end }} -{{- end }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - ports: - - name: metrics - port: {{ required "Need .Values.metricsPort to configure client to listen to metrics at port" .Values.metricsPort}} - protocol: TCP - targetPort: {{ .Values.metricsPort }} - selector: {{ default (include "pushProxy.client.labels" .) $selector | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/validate-install-crd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/validate-install-crd.yaml deleted file mode 100644 index 16abc2fa83..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/validate-install-crd.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -# {{- $found := dict -}} -# {{- set $found "monitoring.coreos.com/v1/ServiceMonitor" false -}} -# {{- range .Capabilities.APIVersions -}} -# {{- if hasKey $found (toString .) -}} -# {{- set $found (toString .) true -}} -# {{- end -}} -# {{- end -}} -# {{- range $_, $exists := $found -}} -# {{- if (eq $exists false) -}} -# {{- required "Required CRDs are missing. Please install Prometheus Operator CRDs before installing this chart." "" -}} -# {{- end -}} -# {{- end -}} -#{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/validate-psp-install.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/values.yaml deleted file mode 100644 index 1e076041b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeEtcd/values.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# Default values for rancher-pushprox. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Default image containing both the proxy and the client was generated from the following Dockerfile -# https://github.com/prometheus-community/PushProx/blob/eeadbe766641699129920ccfaaaa30a85c67fe81/Dockerfile#L1-L15 - -# Configuration - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - seLinux: - enabled: false - -# A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. -# -# For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches -# any of the semver constraints provided as keys on the map. -# -# On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. -# -# If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. -# -# Notes: -# - On running a helm template, Helm generally assumes the kubeVersion is v1.20.0 -# - On running a helm install --dry-run, the correct kubeVersion should be chosen. -kubeVersionOverrides: [] -# - constraint: "< 1.21" -# values: -# metricsPort: 10252 -# clients: -# https: -# enabled: false -# insecureSkipVerify: false -# useServiceAccountCredentials: false - -namespaceOverride: "" - -# The component that is being monitored (i.e. etcd) -component: "component" - -# The port containing the metrics that need to be scraped -metricsPort: 2739 - -# Configure ServiceMonitor that monitors metrics from the metricsPort endpoint -serviceMonitor: - enabled: true - # A list of endpoints that will be added to the ServiceMonitor based on the Endpoint spec - # Source: https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint - # By default, proxyUrl and params._scheme will be overridden based on other values - endpoints: - - port: metrics - -# Configure Service that grabs scrape targets -service: - # The selector that is used to populate the Service's Endpoints object. - # The chart will error out on rendering templating if .Values.clients.enabled is set alongside this field, - # since it is expected that this service should point to the PushProx Clients Daemonset / Deployment - selector: {} - -clients: - enabled: true - # The port which the PushProx client will post PushProx metrics to - port: 9369 - # If unset, this will default to the URL for the proxy service: http://pushprox-{{component}}-proxy.{{namepsace}}.svc.cluster.local:{{proxy.port}} - # Should be modified if the clients are being deployed outside the cluster where the proxy rests, otherwise leave it null - proxyUrl: "" - # If set to true, the client will forward any requests from the host IP to 127.0.0.1 - # It will only allow proxy requests to the metricsPort specified - useLocalhost: false - # Configuration for accessing metrics via HTTPS - https: - # Does the client require https to access the metrics? - enabled: false - # Does the client require requests be sent to http or https? - forceHTTPSScheme: false - # If set to true, the client will create a service account with adequate permissions and set a flag - # on the client to use the service account token provided by it to make authorized scrape requests - useServiceAccountCredentials: false - # Configuration for authentication to metrics via https endpoint - authenticationMethod: - # Reads token from defined file in container - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenFile: - enabled: false - bearerTokenFilePath: "/var/run/secrets/kubernetes.io/serviceaccount/token" - # Reads token from defined secret in namespace - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenSecret: - enabled: false - # Reads token from defined secret in namespace - authorization: - enabled: false - type: "bearer" - credentials: - key: "token" - optional: false - # If set to true, the client will disable SSL security checks - insecureSkipVerify: false - # Directory on host where necessary TLS cert and key to scrape metrics can be found - certDir: "" - # Filenames for files located in .Values.clients.https.certDir that correspond to TLS settings - certFile: "" - keyFile: "" - caCertFile: "" - # seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. - # Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. - seLinuxOptions: {} - - metrics: - # Whether the client should publish PushProx client-specific metrics to .Values.clients.port - enabled: false - - rbac: - # Additional permissions to provide to the ServiceAccount bound to the client - # This can be used to provide additional permissions for the client to scrape metrics from the k8s API - # Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true - additionalRules: [] - - # Resource limits - resources: {} - - # Options to select all nodes to deploy client DaemonSet on - nodeSelector: {} - tolerations: [] - affinity: {} - - image: - repository: rancher/pushprox-client - tag: v0.1.3-rancher2-client - command: ["pushprox-client"] - - copyCertsImage: - repository: rancher/mirrored-library-busybox - tag: 1.31.1 - - # The default intention of rancher-pushprox clients is to scrape hostNetwork metrics across all nodes. - # This can be used to scrape internal Kubernetes components or DaemonSets of hostNetwork Pods in - # situations where a cloud provider firewall prevents Pod-To-Host communication but not Pod-To-Pod. - # However, if the underlying hostNetwork Pod that is being scraped is managed by a Deployment, - # this advanced option enables users to deploy the client as a Deployment instead of a DaemonSet. - # If a user deploys this feature and the underlying Deployment's number of replicas changes, the user will - # be responsible for upgrading this chart accordingly to the right number of replicas. - deployment: - enabled: false - replicas: 0 - -proxy: - enabled: true - # The port through which PushProx clients will communicate to the proxy - port: 8080 - - # Resource limits - resources: {} - - # Options to select a node to run a single proxy deployment on - nodeSelector: {} - tolerations: [] - - image: - repository: rancher/pushprox-proxy - tag: v0.1.3-rancher2-proxy - command: ["pushprox-proxy"] diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/Chart.yaml deleted file mode 100644 index 75e5c7bf14..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/Chart.yaml +++ /dev/null @@ -1,14 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.29.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-pushprox -apiVersion: v1 -appVersion: 0.1.0 -description: Sets up a deployment of the PushProx proxy and a DaemonSet of PushProx - clients. -name: rkeIngressNginx -type: application -version: 0.2.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/README.md deleted file mode 100644 index 345002f48a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# rancher-pushprox - -A Rancher chart based on Rancher [PushProx](https://github.com/rancher/PushProx) that sets up a Deployment of a PushProx proxy and a DaemonSet of PushProx clients on a Kubernetes cluster. - -Installs [rancher-pushprox](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-pushprox) to create PushProx clients that can access their host's network and register with a PushProx proxy. A [Prometheus Operator](https://github.com/coreos/prometheus-operator) ServiceMonitor CR is also included that is configured to scrape the metrics from each of the clients through the proxy. - -Using an instance of this chart is suitable for the following scenarios: -- You need to scrape metrics from a port that should not be accessible outside of the host (e.g. scraping `etcd` metrics in a hardened cluster) -- You need to scrape metrics on a host that are not exposed outside of 127.0.0.1 (e.g. scraping `kube-proxy` metrics) -- You need to scrape metrics through HTTPS using certs hosted directly on `hostPath` -- You need to scrape metrics from Kubernetes components that require authorization via a service account (e.g. permissions to make request to `/metrics`) -- You need to scrape metrics without access to cacerts (i.e. enable `insecureSkipVerify`) - -The clients and proxy are created based on a Rancher fork of the [prometheus-community/PushProx](https://github.com/prometheus-community/PushProx) project. - -## Upgrading to Kubernetes v1.25+ - -Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. - -As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `global.cattle.psp.enabled` set to `false` if it has been previously set to `true`. -​ -> **Note:** -> In this chart release, any previous field that was associated with any PSP resources have been removed in favor of a single global field: `global.cattle.psp.enabled`. - -> **Note:** -> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** -> -> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. - -Upon setting `global.cattle.psp.enabled` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. - -As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. - -## Configuration - -The following tables list the configurable parameters of the rancher-pushprox chart and their default values. - -### General - -#### Required -| Parameter | Description | Example | -| ----- | ----------- | ------ | -| `component` | The component that is being monitored | `kube-etcd` -| `metricsPort` | The port on the host that contains the metrics you want to scrape (e.g. `http://:/metrics`) | `2379` | -| `namespaceOverride` | The namespace to install the chart | `""` - -#### Optional -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `serviceMonitor.enabled` | Deploys a [Prometheus Operator](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor) ServiceMonitor CR that is configured to scrape metrics on the hosts that the clients are deployed on via the proxy. Also deploys a Service that points to all pods with the expected client name that exposes the `metricsPort` selected | `true` | -| `serviceMonitor.endpoints` | A list of endpoints that will be added to the ServiceMonitor based on the [Endpoint spec](https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint) | `[{port: metrics}]` | -| `service.selector` | The selector that is used to populate the Service's Endpoints object. The chart will error out on rendering templating if `.Values.clients.enabled` is set alongside this field, since it is expected that this service should point to the PushProx Clients Daemonset / Deployment | `{}` | -| `clients.enabled` | Deploys a DaemonSet of clients that are each capable of scraping endpoints on the hostNetwork it is deployed on | `true` | -| `clients.port` | The port where the client will publish PushProx client-specific metrics. If deploying multiple clients onto the same node, the clients should not have conflicting ports | `9369` | -| `clients.proxyUrl` | Overrides the default proxyUrl setting of `http://pushprox-{{ .Values.component }}-proxy.{{ . Release.Namespace }}.svc.cluster.local:{{ .Values.proxy.port }}"` with the `proxyUrl` specified | `""` | -| `clients.useLocalhost` | Sets a flag on each client deployment to redirect scrapes directed to `HOST_IP` to `127.0.0.1` | `false` | -| `clients.https.enabled` | Enables scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.forceHTTPSScheme` | Forces scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.useServiceAccountCredentials` | If set to true, the client will create a service account with permissions to scrape `/metrics` endpoint of Kubernetes components. The client will use the service account token provided to make authorized scrape requests to the Kubernetes API | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.enabled` | If set to true, the client will use service account credentials mounted at the configured path `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath`. This requires permissions to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath` | This is a volume mount on the pod with permissions to scrape `/metrics` endpoint of Kubernetes components | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | -| `clients.https.authenticationMethod.bearerTokenSecret.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.authorization.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components | `false` | -| `clients.https.authenticationMethod.authorization.type` | If set, the client will use this type of authorization in its client requests for metrics | `"bearer"` | -| `clients.https.authenticationMethod.authorization.credentials.key` | If set, the client will use this key in the secret created by `clients.https.useServiceAccountCredentials` for authorization in its client requests for metrics | `"token"` | -| `clients.https.authenticationMethod.authorization.credentials.optional` | If set to false, the client will fail if the key in the secret created by `clients.https.useServiceAccountCredentials` does not exist | `false` | -| `clients.https.insecureSkipVerify` | If set to true, the client will disable SSL security checks | `false` | -| `clients.https.certDir` | A `hostPath` where TLS certs can be found. This path is mounted as a volume on an `initContainer` which copies only the necessary files over to an EmptyDir volume used by each client. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.certFile` | The path to the TLS cert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.keyFile` | The path to the TLS key file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.caCertFile` | The path to the TLS cacert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.seLinuxOptions` | seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. | `""` | -| `clients.metrics.enabled` | Whether the client should publish PushProx client-specific metrics. | `false` | -| `clients.rbac.additionalRules` | Additional permissions to provide to the ServiceAccount bound to the client. This can be used to provide additional permissions for the client to scrape metrics from the k8s API. Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true | `[]` | -| `clients.deployment.enabled` | Deploys the client as a Deployment (generally used if the underlying hostNetwork Pod that is being scraped is managed by a Deployment) | `false` | -| `clients.deployment.replicas` | The number of pods the Deployment has, it should match the number of pod the hostNetwork Deployment has. Required and only used if `client.deployment.enable` is set | `0` | -| `clients.deployment.affinity` | The affinity rules that allocate the pod to the node in which the hostNetwork Deployment's pods run. Required and only used if `client.deployment.enable` is set | `{}` | -| `clients.resources` | Set resource limits and requests for the client container | `{}` | -| `clients.nodeSelector` | Select which nodes to deploy the clients on | `{}` | -| `clients.tolerations` | Specify tolerations for clients | `[]` | -| `proxy.enabled` | Deploys the proxy that each client will register with | `true` | -| `proxy.port` | The port exposed by the proxy that each client will register with to allow metrics to be scraped from the host | `8080` | -| `proxy.resources` | Set resource limits and requests for the proxy container | `{}` | -| `proxy.nodeSelector` | Select which nodes the proxy can be deployed on | `{}` | -| `proxy.tolerations` | Specify tolerations (if necessary) to allow the proxy to be deployed on the selected node | `[]` | -| `kubeVersionOverrides` | A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches any of the semver constraints provided as keys on the map. On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. | `[]` - -*Tip: The filepaths set in `clients.https.File` can include wildcard characters*. - -See [rancher-monitoring](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-monitoring) for examples of how this chart can be used. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/_helpers.tpl deleted file mode 100644 index 8e651dccfd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/_helpers.tpl +++ /dev/null @@ -1,166 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# General - -{{- define "applyKubeVersionOverrides" -}} -{{- $overrides := dict -}} -{{- range $override := .Values.kubeVersionOverrides -}} -{{- if semverCompare $override.constraint $.Capabilities.KubeVersion.Version -}} -{{- $_ := mergeOverwrite $overrides $override.values -}} -{{- end -}} -{{- end -}} -{{- $_ := mergeOverwrite .Values $overrides -}} -{{- end -}} - -{{- define "pushprox.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{- define "pushProxy.commonLabels" -}} -release: {{ .Release.Name }} -component: {{ .Values.component | quote }} -provider: kubernetes -{{- end -}} - -{{- define "pushProxy.proxyUrl" -}} -{{- $_ := (required "Template requires either .Values.proxy.port or .Values.client.proxyUrl to set proxyUrl for client" (or .Values.clients.proxyUrl .Values.proxy.port)) -}} -{{- if .Values.clients.proxyUrl -}} -{{ printf "%s" .Values.clients.proxyUrl }} -{{- else -}} -{{ printf "http://%s.%s.svc:%d" (include "pushProxy.proxy.name" .) (include "pushprox.namespace" .) (int .Values.proxy.port) }} -{{- end -}}{{- end -}} - -# Client - -{{- define "pushProxy.client.name" -}} -{{- printf "pushprox-%s-client" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.serviceAccountTokenName" -}} -{{- printf "pushprox-%s-client-service-account-token" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.labels" -}} -k8s-app: {{ template "pushProxy.client.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# Proxy - -{{- define "pushProxy.proxy.name" -}} -{{- printf "pushprox-%s-proxy" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.proxy.labels" -}} -k8s-app: {{ template "pushProxy.proxy.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# ServiceMonitor - -{{- define "pushprox.serviceMonitor.name" -}} -{{- printf "%s-%s" .Release.Name (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.labels" -}} -app: {{ template "pushprox.serviceMonitor.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.endpoints" -}} -{{- $proxyURL := (include "pushProxy.proxyUrl" .) -}} -{{- $useHTTPS := .Values.clients.https.enabled -}} -{{- $forceHTTPSScheme := .Values.clients.https.forceHTTPSScheme -}} -{{- $insecureSkipVerify := .Values.clients.https.insecureSkipVerify -}} -{{- $useServiceAccountCredentials := .Values.clients.https.useServiceAccountCredentials -}} -{{- $serviceAccountTokenName := (include "pushProxy.client.serviceAccountTokenName" . ) -}} -{{- $metricRelabelings := list }} -{{- $endpoints := .Values.serviceMonitor.endpoints }} -{{- range $endpoints }} -{{- if $.Values.proxy.enabled }} -{{- $_ := set . "proxyUrl" $proxyURL }} -{{- end }} -{{- $clusterIdRelabel := dict }} -{{- if $.Values.global.cattle.clusterId }} -{{- $_ := set $clusterIdRelabel "action" "replace" }} -{{- $_ := set $clusterIdRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterIdRelabel "targetLabel" "cluster_id" }} -{{- $_ := set $clusterIdRelabel "replacement" $.Values.global.cattle.clusterId }} -{{- end }} -{{- $clusterNameRelabel := dict }} -{{- if $.Values.global.cattle.clusterName }} -{{- $_ := set $clusterNameRelabel "action" "replace" }} -{{- $_ := set $clusterNameRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterNameRelabel "targetLabel" "cluster_name" }} -{{- $_ := set $clusterNameRelabel "replacement" $.Values.global.cattle.clusterName }} -{{- end }} -{{- $metricRelabelings := gt (len (keys $clusterNameRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterNameRelabel)) ($metricRelabelings) }} -{{- $metricRelabelings := gt (len (keys $clusterIdRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterIdRelabel)) ($metricRelabelings) }} -{{- if not (empty $metricRelabelings) }} -{{- $_ := set . "metricRelabelings" ($metricRelabelings)}} -{{- end }} -{{- if $forceHTTPSScheme -}} -{{- $_ := set . "scheme" "https" }} -{{- end -}} -{{- if $useHTTPS -}} -{{- if (hasKey . "params") }} -{{- $_ := set (get . "params") "_scheme" (list "https") }} -{{- else }} -{{- $_ := set . "params" (dict "_scheme" (list "https")) }} -{{- end }} -{{- end }} -{{- if (hasKey . "tlsConfig") }} -{{- $_ := set (get . "tlsConfig") "insecureSkipVerify" $insecureSkipVerify }} -{{- else }} -{{- $_ := set . "tlsConfig" (dict "insecureSkipVerify" $insecureSkipVerify) }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenFile.enabled }} -{{- $_ := set . "bearerTokenFile" $.Values.clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenSecret.enabled }} -{{- $_ := set . "bearerTokenSecret" $serviceAccountTokenName }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.authorization.enabled }} -{{- if (hasKey . "authorization") }} -{{- $_ := set (get . "authorization") "type" $.Values.clients.https.authenticationMethod.authorization.type }} -{{- $_ := set (get . "authorization") "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional) }} -{{- else }} -{{- $_ := set . "authorization" (dict "type" $.Values.clients.https.authenticationMethod.authorization.type) }} -{{- $_ := set . "authorization" (dict "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional)) }} -{{- end }} -{{- end }} -{{- end }} -{{- toYaml $endpoints }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-clients-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-clients-rbac.yaml deleted file mode 100644 index a8e27c3735..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-clients-rbac.yaml +++ /dev/null @@ -1,97 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.client.name" . }} -{{- end }} -{{- if and .Values.clients.https.enabled .Values.clients.https.useServiceAccountCredentials }} -- nonResourceURLs: ["/metrics"] - verbs: ["get"] -{{- if .Values.clients.rbac.additionalRules }} -{{ toYaml .Values.clients.rbac.additionalRules }} -{{- end }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.client.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} ---- -{{- if .Values.clients.https.useServiceAccountCredentials }} -apiVersion: v1 -kind: Secret -type: kubernetes.io/service-account-token -metadata: - name: {{ template "pushProxy.client.serviceAccountTokenName" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - annotations: - kubernetes.io/service-account.name: {{ template "pushProxy.client.name" . }} -{{- end }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: true - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 6 }} -{{- end }} - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - - 'emptyDir' - - 'hostPath' - allowedHostPaths: - - pathPrefix: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - readOnly: true -{{- end }} -{{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-clients.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-clients.yaml deleted file mode 100644 index e8fcfb3883..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-clients.yaml +++ /dev/null @@ -1,157 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: apps/v1 -{{- if .Values.clients.deployment.enabled }} -kind: Deployment -{{- else }} -kind: DaemonSet -{{- end }} -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - pushprox-exporter: "client" -spec: - {{- if .Values.clients.deployment.enabled }} - replicas: {{ .Values.clients.deployment.replicas }} - {{- end }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.client.labels" . | nindent 8 }} - spec: - {{- if .Values.clients.affinity }} - affinity: {{ toYaml .Values.clients.affinity | nindent 8 }} - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.clients.nodeSelector }} -{{ toYaml .Values.clients.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.clients.tolerations }} -{{ toYaml .Values.clients.tolerations | indent 8 }} -{{- end }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - serviceAccountName: {{ template "pushProxy.client.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-client - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - {{- range .Values.clients.command }} - - {{ . | quote }} - {{- end }} - args: - - --fqdn=$(HOST_IP) - - --proxy-url=$(PROXY_URL) - {{- if .Values.clients.metrics.enabled }} - - --metrics-addr=$(PORT) - {{- end }} - - --allow-port={{ required "Need .Values.metricsPort to configure client to be allowed to scrape metrics at port" .Values.metricsPort}} - {{- if .Values.clients.useLocalhost }} - - --use-localhost - {{- end }} - {{- if .Values.clients.https.enabled }} - {{- if .Values.clients.https.insecureSkipVerify }} - - --insecure-skip-verify - {{- end }} - {{- if .Values.clients.https.useServiceAccountCredentials }} - - --token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- end }} - {{- if .Values.clients.https.certDir }} - - --tls.cert=/etc/ssl/push-proxy/push-proxy.pem - - --tls.key=/etc/ssl/push-proxy/push-proxy-key.pem - - --tls.cacert=/etc/ssl/push-proxy/push-proxy-ca-cert.pem - {{- end }} - {{- end }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if .Values.clients.metrics.enabled }} - - name: PORT - value: :{{ .Values.clients.port }} - {{- end }} - - name: PROXY_URL - value: {{ template "pushProxy.proxyUrl" . }} - securityContext: - runAsNonRoot: true - runAsUser: 1000 - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - volumeMounts: - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - {{- end }} - {{- if .Values.clients.resources }} - resources: {{ toYaml .Values.clients.resources | nindent 10 }} - {{- end }} - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - initContainers: - - name: copy-certs - image: {{ template "system_default_registry" . }}{{ .Values.clients.copyCertsImage.repository }}:{{ .Values.clients.copyCertsImage.tag }} - command: - - sh - - -c - - | - echo "Searching for files to copy within the source volume" - echo "cert: ${CERT_FILE_NAME}" - echo "key: ${KEY_FILE_NAME}" - echo "cacert: ${CACERT_FILE_NAME}" - - CERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CERT_FILE_NAME}" | sort -r | head -n 1) - KEY_FILE_SOURCE=$(find /etc/source/ -type f -name "${KEY_FILE_NAME}" | sort -r | head -n 1) - CACERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CACERT_FILE_NAME}" | sort -r | head -n 1) - - test -z ${CERT_FILE_SOURCE} && echo "Failed to find cert file" && exit 1 - test -z ${KEY_FILE_SOURCE} && echo "Failed to find key file" && exit 1 - test -z ${CACERT_FILE_SOURCE} && echo "Failed to find cacert file" && exit 1 - - echo "Copying cert file from $CERT_FILE_SOURCE to $CERT_FILE_TARGET" - cp $CERT_FILE_SOURCE $CERT_FILE_TARGET || exit 1 - chmod 444 $CERT_FILE_TARGET || exit 1 - - echo "Copying key file from $KEY_FILE_SOURCE to $KEY_FILE_TARGET" - cp $KEY_FILE_SOURCE $KEY_FILE_TARGET || exit 1 - chmod 444 $KEY_FILE_TARGET || exit 1 - - echo "Copying cacert file from $CACERT_FILE_SOURCE to $CACERT_FILE_TARGET" - cp $CACERT_FILE_SOURCE $CACERT_FILE_TARGET || exit 1 - chmod 444 $CACERT_FILE_TARGET || exit 1 - env: - - name: CERT_FILE_NAME - value: {{ required "Need a TLS cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.certFile }} - - name: KEY_FILE_NAME - value: {{ required "Need a TLS key file for scraping metrics endpoint over HTTPs" .Values.clients.https.keyFile }} - - name: CACERT_FILE_NAME - value: {{ required "Need a TLS CA cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.caCertFile }} - - name: CERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy.pem - - name: KEY_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-key.pem - - name: CACERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-ca-cert.pem - securityContext: - runAsNonRoot: false -{{- if and .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 12 }} -{{- end }} - volumeMounts: - - name: metrics-cert-dir-source - mountPath: /etc/source - readOnly: true - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - volumes: - - name: metrics-cert-dir-source - hostPath: - path: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - - name: metrics-cert-dir - emptyDir: {} - {{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-proxy-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-proxy-rbac.yaml deleted file mode 100644 index eefe609058..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-proxy-rbac.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.proxy.name" . }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.proxy.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- end }}{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-proxy.yaml deleted file mode 100644 index 723bbd6c00..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-proxy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} - pushprox-exporter: "proxy" -spec: - selector: - matchLabels: {{ include "pushProxy.proxy.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.proxy.labels" . | nindent 8 }} - spec: - securityContext: - runAsNonRoot: true - runAsUser: 1000 - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.proxy.nodeSelector }} -{{ toYaml .Values.proxy.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.proxy.tolerations }} -{{ toYaml .Values.proxy.tolerations | indent 8 }} -{{- end }} - serviceAccountName: {{ template "pushProxy.proxy.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-proxy - image: {{ template "system_default_registry" . }}{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag }} - command: - {{- range .Values.proxy.command }} - - {{ . | quote }} - {{- end }} - {{- if .Values.proxy.resources }} - resources: {{ toYaml .Values.proxy.resources | nindent 10 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - ports: - - name: pp-proxy - port: {{ required "Need .Values.proxy.port to configure proxy" .Values.proxy.port }} - protocol: TCP - targetPort: {{ .Values.proxy.port }} - selector: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-servicemonitor.yaml deleted file mode 100644 index 67eb2216b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/pushprox-servicemonitor.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.serviceMonitor }}{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "pushprox.serviceMonitor.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.serviceMonitor.labels" . | nindent 4 }} -spec: - endpoints: {{include "pushProxy.serviceMonitor.endpoints" . | nindent 4 }} - jobLabel: component - podTargetLabels: - - component - - pushprox-exporter - namespaceSelector: - matchNames: - - {{ template "pushprox.namespace" . }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} ---- -{{- $selector := "" }} -{{- if not (kindIs "invalid" .Values.service) }} -{{- if not (kindIs "invalid" .Values.service.selector) }} -{{ if .Values.service.selector }} -{{- if .Values.clients.enabled }} -{{- required (printf "Cannot override .Values.service.selector=%s when .Values.clients.enabled=true" (toJson .Values.service.selector)) "" }} -{{- end }} -{{- $selector = (toYaml .Values.service.selector) }} -{{- end }} -{{- end }} -{{- end }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - ports: - - name: metrics - port: {{ required "Need .Values.metricsPort to configure client to listen to metrics at port" .Values.metricsPort}} - protocol: TCP - targetPort: {{ .Values.metricsPort }} - selector: {{ default (include "pushProxy.client.labels" .) $selector | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/validate-install-crd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/validate-install-crd.yaml deleted file mode 100644 index 16abc2fa83..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/validate-install-crd.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -# {{- $found := dict -}} -# {{- set $found "monitoring.coreos.com/v1/ServiceMonitor" false -}} -# {{- range .Capabilities.APIVersions -}} -# {{- if hasKey $found (toString .) -}} -# {{- set $found (toString .) true -}} -# {{- end -}} -# {{- end -}} -# {{- range $_, $exists := $found -}} -# {{- if (eq $exists false) -}} -# {{- required "Required CRDs are missing. Please install Prometheus Operator CRDs before installing this chart." "" -}} -# {{- end -}} -# {{- end -}} -#{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/validate-psp-install.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/values.yaml deleted file mode 100644 index 1e076041b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeIngressNginx/values.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# Default values for rancher-pushprox. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Default image containing both the proxy and the client was generated from the following Dockerfile -# https://github.com/prometheus-community/PushProx/blob/eeadbe766641699129920ccfaaaa30a85c67fe81/Dockerfile#L1-L15 - -# Configuration - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - seLinux: - enabled: false - -# A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. -# -# For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches -# any of the semver constraints provided as keys on the map. -# -# On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. -# -# If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. -# -# Notes: -# - On running a helm template, Helm generally assumes the kubeVersion is v1.20.0 -# - On running a helm install --dry-run, the correct kubeVersion should be chosen. -kubeVersionOverrides: [] -# - constraint: "< 1.21" -# values: -# metricsPort: 10252 -# clients: -# https: -# enabled: false -# insecureSkipVerify: false -# useServiceAccountCredentials: false - -namespaceOverride: "" - -# The component that is being monitored (i.e. etcd) -component: "component" - -# The port containing the metrics that need to be scraped -metricsPort: 2739 - -# Configure ServiceMonitor that monitors metrics from the metricsPort endpoint -serviceMonitor: - enabled: true - # A list of endpoints that will be added to the ServiceMonitor based on the Endpoint spec - # Source: https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint - # By default, proxyUrl and params._scheme will be overridden based on other values - endpoints: - - port: metrics - -# Configure Service that grabs scrape targets -service: - # The selector that is used to populate the Service's Endpoints object. - # The chart will error out on rendering templating if .Values.clients.enabled is set alongside this field, - # since it is expected that this service should point to the PushProx Clients Daemonset / Deployment - selector: {} - -clients: - enabled: true - # The port which the PushProx client will post PushProx metrics to - port: 9369 - # If unset, this will default to the URL for the proxy service: http://pushprox-{{component}}-proxy.{{namepsace}}.svc.cluster.local:{{proxy.port}} - # Should be modified if the clients are being deployed outside the cluster where the proxy rests, otherwise leave it null - proxyUrl: "" - # If set to true, the client will forward any requests from the host IP to 127.0.0.1 - # It will only allow proxy requests to the metricsPort specified - useLocalhost: false - # Configuration for accessing metrics via HTTPS - https: - # Does the client require https to access the metrics? - enabled: false - # Does the client require requests be sent to http or https? - forceHTTPSScheme: false - # If set to true, the client will create a service account with adequate permissions and set a flag - # on the client to use the service account token provided by it to make authorized scrape requests - useServiceAccountCredentials: false - # Configuration for authentication to metrics via https endpoint - authenticationMethod: - # Reads token from defined file in container - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenFile: - enabled: false - bearerTokenFilePath: "/var/run/secrets/kubernetes.io/serviceaccount/token" - # Reads token from defined secret in namespace - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenSecret: - enabled: false - # Reads token from defined secret in namespace - authorization: - enabled: false - type: "bearer" - credentials: - key: "token" - optional: false - # If set to true, the client will disable SSL security checks - insecureSkipVerify: false - # Directory on host where necessary TLS cert and key to scrape metrics can be found - certDir: "" - # Filenames for files located in .Values.clients.https.certDir that correspond to TLS settings - certFile: "" - keyFile: "" - caCertFile: "" - # seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. - # Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. - seLinuxOptions: {} - - metrics: - # Whether the client should publish PushProx client-specific metrics to .Values.clients.port - enabled: false - - rbac: - # Additional permissions to provide to the ServiceAccount bound to the client - # This can be used to provide additional permissions for the client to scrape metrics from the k8s API - # Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true - additionalRules: [] - - # Resource limits - resources: {} - - # Options to select all nodes to deploy client DaemonSet on - nodeSelector: {} - tolerations: [] - affinity: {} - - image: - repository: rancher/pushprox-client - tag: v0.1.3-rancher2-client - command: ["pushprox-client"] - - copyCertsImage: - repository: rancher/mirrored-library-busybox - tag: 1.31.1 - - # The default intention of rancher-pushprox clients is to scrape hostNetwork metrics across all nodes. - # This can be used to scrape internal Kubernetes components or DaemonSets of hostNetwork Pods in - # situations where a cloud provider firewall prevents Pod-To-Host communication but not Pod-To-Pod. - # However, if the underlying hostNetwork Pod that is being scraped is managed by a Deployment, - # this advanced option enables users to deploy the client as a Deployment instead of a DaemonSet. - # If a user deploys this feature and the underlying Deployment's number of replicas changes, the user will - # be responsible for upgrading this chart accordingly to the right number of replicas. - deployment: - enabled: false - replicas: 0 - -proxy: - enabled: true - # The port through which PushProx clients will communicate to the proxy - port: 8080 - - # Resource limits - resources: {} - - # Options to select a node to run a single proxy deployment on - nodeSelector: {} - tolerations: [] - - image: - repository: rancher/pushprox-proxy - tag: v0.1.3-rancher2-proxy - command: ["pushprox-proxy"] diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/Chart.yaml deleted file mode 100644 index d59c249feb..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/Chart.yaml +++ /dev/null @@ -1,14 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.29.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-pushprox -apiVersion: v1 -appVersion: 0.1.0 -description: Sets up a deployment of the PushProx proxy and a DaemonSet of PushProx - clients. -name: rkeProxy -type: application -version: 0.2.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/README.md deleted file mode 100644 index 345002f48a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# rancher-pushprox - -A Rancher chart based on Rancher [PushProx](https://github.com/rancher/PushProx) that sets up a Deployment of a PushProx proxy and a DaemonSet of PushProx clients on a Kubernetes cluster. - -Installs [rancher-pushprox](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-pushprox) to create PushProx clients that can access their host's network and register with a PushProx proxy. A [Prometheus Operator](https://github.com/coreos/prometheus-operator) ServiceMonitor CR is also included that is configured to scrape the metrics from each of the clients through the proxy. - -Using an instance of this chart is suitable for the following scenarios: -- You need to scrape metrics from a port that should not be accessible outside of the host (e.g. scraping `etcd` metrics in a hardened cluster) -- You need to scrape metrics on a host that are not exposed outside of 127.0.0.1 (e.g. scraping `kube-proxy` metrics) -- You need to scrape metrics through HTTPS using certs hosted directly on `hostPath` -- You need to scrape metrics from Kubernetes components that require authorization via a service account (e.g. permissions to make request to `/metrics`) -- You need to scrape metrics without access to cacerts (i.e. enable `insecureSkipVerify`) - -The clients and proxy are created based on a Rancher fork of the [prometheus-community/PushProx](https://github.com/prometheus-community/PushProx) project. - -## Upgrading to Kubernetes v1.25+ - -Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. - -As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `global.cattle.psp.enabled` set to `false` if it has been previously set to `true`. -​ -> **Note:** -> In this chart release, any previous field that was associated with any PSP resources have been removed in favor of a single global field: `global.cattle.psp.enabled`. - -> **Note:** -> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** -> -> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. - -Upon setting `global.cattle.psp.enabled` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. - -As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. - -## Configuration - -The following tables list the configurable parameters of the rancher-pushprox chart and their default values. - -### General - -#### Required -| Parameter | Description | Example | -| ----- | ----------- | ------ | -| `component` | The component that is being monitored | `kube-etcd` -| `metricsPort` | The port on the host that contains the metrics you want to scrape (e.g. `http://:/metrics`) | `2379` | -| `namespaceOverride` | The namespace to install the chart | `""` - -#### Optional -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `serviceMonitor.enabled` | Deploys a [Prometheus Operator](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor) ServiceMonitor CR that is configured to scrape metrics on the hosts that the clients are deployed on via the proxy. Also deploys a Service that points to all pods with the expected client name that exposes the `metricsPort` selected | `true` | -| `serviceMonitor.endpoints` | A list of endpoints that will be added to the ServiceMonitor based on the [Endpoint spec](https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint) | `[{port: metrics}]` | -| `service.selector` | The selector that is used to populate the Service's Endpoints object. The chart will error out on rendering templating if `.Values.clients.enabled` is set alongside this field, since it is expected that this service should point to the PushProx Clients Daemonset / Deployment | `{}` | -| `clients.enabled` | Deploys a DaemonSet of clients that are each capable of scraping endpoints on the hostNetwork it is deployed on | `true` | -| `clients.port` | The port where the client will publish PushProx client-specific metrics. If deploying multiple clients onto the same node, the clients should not have conflicting ports | `9369` | -| `clients.proxyUrl` | Overrides the default proxyUrl setting of `http://pushprox-{{ .Values.component }}-proxy.{{ . Release.Namespace }}.svc.cluster.local:{{ .Values.proxy.port }}"` with the `proxyUrl` specified | `""` | -| `clients.useLocalhost` | Sets a flag on each client deployment to redirect scrapes directed to `HOST_IP` to `127.0.0.1` | `false` | -| `clients.https.enabled` | Enables scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.forceHTTPSScheme` | Forces scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.useServiceAccountCredentials` | If set to true, the client will create a service account with permissions to scrape `/metrics` endpoint of Kubernetes components. The client will use the service account token provided to make authorized scrape requests to the Kubernetes API | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.enabled` | If set to true, the client will use service account credentials mounted at the configured path `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath`. This requires permissions to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath` | This is a volume mount on the pod with permissions to scrape `/metrics` endpoint of Kubernetes components | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | -| `clients.https.authenticationMethod.bearerTokenSecret.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.authorization.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components | `false` | -| `clients.https.authenticationMethod.authorization.type` | If set, the client will use this type of authorization in its client requests for metrics | `"bearer"` | -| `clients.https.authenticationMethod.authorization.credentials.key` | If set, the client will use this key in the secret created by `clients.https.useServiceAccountCredentials` for authorization in its client requests for metrics | `"token"` | -| `clients.https.authenticationMethod.authorization.credentials.optional` | If set to false, the client will fail if the key in the secret created by `clients.https.useServiceAccountCredentials` does not exist | `false` | -| `clients.https.insecureSkipVerify` | If set to true, the client will disable SSL security checks | `false` | -| `clients.https.certDir` | A `hostPath` where TLS certs can be found. This path is mounted as a volume on an `initContainer` which copies only the necessary files over to an EmptyDir volume used by each client. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.certFile` | The path to the TLS cert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.keyFile` | The path to the TLS key file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.caCertFile` | The path to the TLS cacert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.seLinuxOptions` | seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. | `""` | -| `clients.metrics.enabled` | Whether the client should publish PushProx client-specific metrics. | `false` | -| `clients.rbac.additionalRules` | Additional permissions to provide to the ServiceAccount bound to the client. This can be used to provide additional permissions for the client to scrape metrics from the k8s API. Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true | `[]` | -| `clients.deployment.enabled` | Deploys the client as a Deployment (generally used if the underlying hostNetwork Pod that is being scraped is managed by a Deployment) | `false` | -| `clients.deployment.replicas` | The number of pods the Deployment has, it should match the number of pod the hostNetwork Deployment has. Required and only used if `client.deployment.enable` is set | `0` | -| `clients.deployment.affinity` | The affinity rules that allocate the pod to the node in which the hostNetwork Deployment's pods run. Required and only used if `client.deployment.enable` is set | `{}` | -| `clients.resources` | Set resource limits and requests for the client container | `{}` | -| `clients.nodeSelector` | Select which nodes to deploy the clients on | `{}` | -| `clients.tolerations` | Specify tolerations for clients | `[]` | -| `proxy.enabled` | Deploys the proxy that each client will register with | `true` | -| `proxy.port` | The port exposed by the proxy that each client will register with to allow metrics to be scraped from the host | `8080` | -| `proxy.resources` | Set resource limits and requests for the proxy container | `{}` | -| `proxy.nodeSelector` | Select which nodes the proxy can be deployed on | `{}` | -| `proxy.tolerations` | Specify tolerations (if necessary) to allow the proxy to be deployed on the selected node | `[]` | -| `kubeVersionOverrides` | A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches any of the semver constraints provided as keys on the map. On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. | `[]` - -*Tip: The filepaths set in `clients.https.File` can include wildcard characters*. - -See [rancher-monitoring](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-monitoring) for examples of how this chart can be used. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/_helpers.tpl deleted file mode 100644 index 8e651dccfd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/_helpers.tpl +++ /dev/null @@ -1,166 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# General - -{{- define "applyKubeVersionOverrides" -}} -{{- $overrides := dict -}} -{{- range $override := .Values.kubeVersionOverrides -}} -{{- if semverCompare $override.constraint $.Capabilities.KubeVersion.Version -}} -{{- $_ := mergeOverwrite $overrides $override.values -}} -{{- end -}} -{{- end -}} -{{- $_ := mergeOverwrite .Values $overrides -}} -{{- end -}} - -{{- define "pushprox.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{- define "pushProxy.commonLabels" -}} -release: {{ .Release.Name }} -component: {{ .Values.component | quote }} -provider: kubernetes -{{- end -}} - -{{- define "pushProxy.proxyUrl" -}} -{{- $_ := (required "Template requires either .Values.proxy.port or .Values.client.proxyUrl to set proxyUrl for client" (or .Values.clients.proxyUrl .Values.proxy.port)) -}} -{{- if .Values.clients.proxyUrl -}} -{{ printf "%s" .Values.clients.proxyUrl }} -{{- else -}} -{{ printf "http://%s.%s.svc:%d" (include "pushProxy.proxy.name" .) (include "pushprox.namespace" .) (int .Values.proxy.port) }} -{{- end -}}{{- end -}} - -# Client - -{{- define "pushProxy.client.name" -}} -{{- printf "pushprox-%s-client" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.serviceAccountTokenName" -}} -{{- printf "pushprox-%s-client-service-account-token" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.labels" -}} -k8s-app: {{ template "pushProxy.client.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# Proxy - -{{- define "pushProxy.proxy.name" -}} -{{- printf "pushprox-%s-proxy" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.proxy.labels" -}} -k8s-app: {{ template "pushProxy.proxy.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# ServiceMonitor - -{{- define "pushprox.serviceMonitor.name" -}} -{{- printf "%s-%s" .Release.Name (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.labels" -}} -app: {{ template "pushprox.serviceMonitor.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.endpoints" -}} -{{- $proxyURL := (include "pushProxy.proxyUrl" .) -}} -{{- $useHTTPS := .Values.clients.https.enabled -}} -{{- $forceHTTPSScheme := .Values.clients.https.forceHTTPSScheme -}} -{{- $insecureSkipVerify := .Values.clients.https.insecureSkipVerify -}} -{{- $useServiceAccountCredentials := .Values.clients.https.useServiceAccountCredentials -}} -{{- $serviceAccountTokenName := (include "pushProxy.client.serviceAccountTokenName" . ) -}} -{{- $metricRelabelings := list }} -{{- $endpoints := .Values.serviceMonitor.endpoints }} -{{- range $endpoints }} -{{- if $.Values.proxy.enabled }} -{{- $_ := set . "proxyUrl" $proxyURL }} -{{- end }} -{{- $clusterIdRelabel := dict }} -{{- if $.Values.global.cattle.clusterId }} -{{- $_ := set $clusterIdRelabel "action" "replace" }} -{{- $_ := set $clusterIdRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterIdRelabel "targetLabel" "cluster_id" }} -{{- $_ := set $clusterIdRelabel "replacement" $.Values.global.cattle.clusterId }} -{{- end }} -{{- $clusterNameRelabel := dict }} -{{- if $.Values.global.cattle.clusterName }} -{{- $_ := set $clusterNameRelabel "action" "replace" }} -{{- $_ := set $clusterNameRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterNameRelabel "targetLabel" "cluster_name" }} -{{- $_ := set $clusterNameRelabel "replacement" $.Values.global.cattle.clusterName }} -{{- end }} -{{- $metricRelabelings := gt (len (keys $clusterNameRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterNameRelabel)) ($metricRelabelings) }} -{{- $metricRelabelings := gt (len (keys $clusterIdRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterIdRelabel)) ($metricRelabelings) }} -{{- if not (empty $metricRelabelings) }} -{{- $_ := set . "metricRelabelings" ($metricRelabelings)}} -{{- end }} -{{- if $forceHTTPSScheme -}} -{{- $_ := set . "scheme" "https" }} -{{- end -}} -{{- if $useHTTPS -}} -{{- if (hasKey . "params") }} -{{- $_ := set (get . "params") "_scheme" (list "https") }} -{{- else }} -{{- $_ := set . "params" (dict "_scheme" (list "https")) }} -{{- end }} -{{- end }} -{{- if (hasKey . "tlsConfig") }} -{{- $_ := set (get . "tlsConfig") "insecureSkipVerify" $insecureSkipVerify }} -{{- else }} -{{- $_ := set . "tlsConfig" (dict "insecureSkipVerify" $insecureSkipVerify) }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenFile.enabled }} -{{- $_ := set . "bearerTokenFile" $.Values.clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenSecret.enabled }} -{{- $_ := set . "bearerTokenSecret" $serviceAccountTokenName }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.authorization.enabled }} -{{- if (hasKey . "authorization") }} -{{- $_ := set (get . "authorization") "type" $.Values.clients.https.authenticationMethod.authorization.type }} -{{- $_ := set (get . "authorization") "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional) }} -{{- else }} -{{- $_ := set . "authorization" (dict "type" $.Values.clients.https.authenticationMethod.authorization.type) }} -{{- $_ := set . "authorization" (dict "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional)) }} -{{- end }} -{{- end }} -{{- end }} -{{- toYaml $endpoints }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-clients-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-clients-rbac.yaml deleted file mode 100644 index a8e27c3735..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-clients-rbac.yaml +++ /dev/null @@ -1,97 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.client.name" . }} -{{- end }} -{{- if and .Values.clients.https.enabled .Values.clients.https.useServiceAccountCredentials }} -- nonResourceURLs: ["/metrics"] - verbs: ["get"] -{{- if .Values.clients.rbac.additionalRules }} -{{ toYaml .Values.clients.rbac.additionalRules }} -{{- end }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.client.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} ---- -{{- if .Values.clients.https.useServiceAccountCredentials }} -apiVersion: v1 -kind: Secret -type: kubernetes.io/service-account-token -metadata: - name: {{ template "pushProxy.client.serviceAccountTokenName" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - annotations: - kubernetes.io/service-account.name: {{ template "pushProxy.client.name" . }} -{{- end }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: true - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 6 }} -{{- end }} - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - - 'emptyDir' - - 'hostPath' - allowedHostPaths: - - pathPrefix: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - readOnly: true -{{- end }} -{{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-clients.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-clients.yaml deleted file mode 100644 index e8fcfb3883..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-clients.yaml +++ /dev/null @@ -1,157 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: apps/v1 -{{- if .Values.clients.deployment.enabled }} -kind: Deployment -{{- else }} -kind: DaemonSet -{{- end }} -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - pushprox-exporter: "client" -spec: - {{- if .Values.clients.deployment.enabled }} - replicas: {{ .Values.clients.deployment.replicas }} - {{- end }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.client.labels" . | nindent 8 }} - spec: - {{- if .Values.clients.affinity }} - affinity: {{ toYaml .Values.clients.affinity | nindent 8 }} - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.clients.nodeSelector }} -{{ toYaml .Values.clients.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.clients.tolerations }} -{{ toYaml .Values.clients.tolerations | indent 8 }} -{{- end }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - serviceAccountName: {{ template "pushProxy.client.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-client - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - {{- range .Values.clients.command }} - - {{ . | quote }} - {{- end }} - args: - - --fqdn=$(HOST_IP) - - --proxy-url=$(PROXY_URL) - {{- if .Values.clients.metrics.enabled }} - - --metrics-addr=$(PORT) - {{- end }} - - --allow-port={{ required "Need .Values.metricsPort to configure client to be allowed to scrape metrics at port" .Values.metricsPort}} - {{- if .Values.clients.useLocalhost }} - - --use-localhost - {{- end }} - {{- if .Values.clients.https.enabled }} - {{- if .Values.clients.https.insecureSkipVerify }} - - --insecure-skip-verify - {{- end }} - {{- if .Values.clients.https.useServiceAccountCredentials }} - - --token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- end }} - {{- if .Values.clients.https.certDir }} - - --tls.cert=/etc/ssl/push-proxy/push-proxy.pem - - --tls.key=/etc/ssl/push-proxy/push-proxy-key.pem - - --tls.cacert=/etc/ssl/push-proxy/push-proxy-ca-cert.pem - {{- end }} - {{- end }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if .Values.clients.metrics.enabled }} - - name: PORT - value: :{{ .Values.clients.port }} - {{- end }} - - name: PROXY_URL - value: {{ template "pushProxy.proxyUrl" . }} - securityContext: - runAsNonRoot: true - runAsUser: 1000 - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - volumeMounts: - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - {{- end }} - {{- if .Values.clients.resources }} - resources: {{ toYaml .Values.clients.resources | nindent 10 }} - {{- end }} - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - initContainers: - - name: copy-certs - image: {{ template "system_default_registry" . }}{{ .Values.clients.copyCertsImage.repository }}:{{ .Values.clients.copyCertsImage.tag }} - command: - - sh - - -c - - | - echo "Searching for files to copy within the source volume" - echo "cert: ${CERT_FILE_NAME}" - echo "key: ${KEY_FILE_NAME}" - echo "cacert: ${CACERT_FILE_NAME}" - - CERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CERT_FILE_NAME}" | sort -r | head -n 1) - KEY_FILE_SOURCE=$(find /etc/source/ -type f -name "${KEY_FILE_NAME}" | sort -r | head -n 1) - CACERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CACERT_FILE_NAME}" | sort -r | head -n 1) - - test -z ${CERT_FILE_SOURCE} && echo "Failed to find cert file" && exit 1 - test -z ${KEY_FILE_SOURCE} && echo "Failed to find key file" && exit 1 - test -z ${CACERT_FILE_SOURCE} && echo "Failed to find cacert file" && exit 1 - - echo "Copying cert file from $CERT_FILE_SOURCE to $CERT_FILE_TARGET" - cp $CERT_FILE_SOURCE $CERT_FILE_TARGET || exit 1 - chmod 444 $CERT_FILE_TARGET || exit 1 - - echo "Copying key file from $KEY_FILE_SOURCE to $KEY_FILE_TARGET" - cp $KEY_FILE_SOURCE $KEY_FILE_TARGET || exit 1 - chmod 444 $KEY_FILE_TARGET || exit 1 - - echo "Copying cacert file from $CACERT_FILE_SOURCE to $CACERT_FILE_TARGET" - cp $CACERT_FILE_SOURCE $CACERT_FILE_TARGET || exit 1 - chmod 444 $CACERT_FILE_TARGET || exit 1 - env: - - name: CERT_FILE_NAME - value: {{ required "Need a TLS cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.certFile }} - - name: KEY_FILE_NAME - value: {{ required "Need a TLS key file for scraping metrics endpoint over HTTPs" .Values.clients.https.keyFile }} - - name: CACERT_FILE_NAME - value: {{ required "Need a TLS CA cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.caCertFile }} - - name: CERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy.pem - - name: KEY_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-key.pem - - name: CACERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-ca-cert.pem - securityContext: - runAsNonRoot: false -{{- if and .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 12 }} -{{- end }} - volumeMounts: - - name: metrics-cert-dir-source - mountPath: /etc/source - readOnly: true - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - volumes: - - name: metrics-cert-dir-source - hostPath: - path: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - - name: metrics-cert-dir - emptyDir: {} - {{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-proxy-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-proxy-rbac.yaml deleted file mode 100644 index eefe609058..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-proxy-rbac.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.proxy.name" . }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.proxy.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- end }}{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-proxy.yaml deleted file mode 100644 index 723bbd6c00..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-proxy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} - pushprox-exporter: "proxy" -spec: - selector: - matchLabels: {{ include "pushProxy.proxy.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.proxy.labels" . | nindent 8 }} - spec: - securityContext: - runAsNonRoot: true - runAsUser: 1000 - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.proxy.nodeSelector }} -{{ toYaml .Values.proxy.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.proxy.tolerations }} -{{ toYaml .Values.proxy.tolerations | indent 8 }} -{{- end }} - serviceAccountName: {{ template "pushProxy.proxy.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-proxy - image: {{ template "system_default_registry" . }}{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag }} - command: - {{- range .Values.proxy.command }} - - {{ . | quote }} - {{- end }} - {{- if .Values.proxy.resources }} - resources: {{ toYaml .Values.proxy.resources | nindent 10 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - ports: - - name: pp-proxy - port: {{ required "Need .Values.proxy.port to configure proxy" .Values.proxy.port }} - protocol: TCP - targetPort: {{ .Values.proxy.port }} - selector: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-servicemonitor.yaml deleted file mode 100644 index 67eb2216b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/pushprox-servicemonitor.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.serviceMonitor }}{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "pushprox.serviceMonitor.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.serviceMonitor.labels" . | nindent 4 }} -spec: - endpoints: {{include "pushProxy.serviceMonitor.endpoints" . | nindent 4 }} - jobLabel: component - podTargetLabels: - - component - - pushprox-exporter - namespaceSelector: - matchNames: - - {{ template "pushprox.namespace" . }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} ---- -{{- $selector := "" }} -{{- if not (kindIs "invalid" .Values.service) }} -{{- if not (kindIs "invalid" .Values.service.selector) }} -{{ if .Values.service.selector }} -{{- if .Values.clients.enabled }} -{{- required (printf "Cannot override .Values.service.selector=%s when .Values.clients.enabled=true" (toJson .Values.service.selector)) "" }} -{{- end }} -{{- $selector = (toYaml .Values.service.selector) }} -{{- end }} -{{- end }} -{{- end }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - ports: - - name: metrics - port: {{ required "Need .Values.metricsPort to configure client to listen to metrics at port" .Values.metricsPort}} - protocol: TCP - targetPort: {{ .Values.metricsPort }} - selector: {{ default (include "pushProxy.client.labels" .) $selector | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/validate-install-crd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/validate-install-crd.yaml deleted file mode 100644 index 16abc2fa83..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/validate-install-crd.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -# {{- $found := dict -}} -# {{- set $found "monitoring.coreos.com/v1/ServiceMonitor" false -}} -# {{- range .Capabilities.APIVersions -}} -# {{- if hasKey $found (toString .) -}} -# {{- set $found (toString .) true -}} -# {{- end -}} -# {{- end -}} -# {{- range $_, $exists := $found -}} -# {{- if (eq $exists false) -}} -# {{- required "Required CRDs are missing. Please install Prometheus Operator CRDs before installing this chart." "" -}} -# {{- end -}} -# {{- end -}} -#{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/validate-psp-install.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/values.yaml deleted file mode 100644 index 1e076041b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeProxy/values.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# Default values for rancher-pushprox. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Default image containing both the proxy and the client was generated from the following Dockerfile -# https://github.com/prometheus-community/PushProx/blob/eeadbe766641699129920ccfaaaa30a85c67fe81/Dockerfile#L1-L15 - -# Configuration - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - seLinux: - enabled: false - -# A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. -# -# For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches -# any of the semver constraints provided as keys on the map. -# -# On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. -# -# If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. -# -# Notes: -# - On running a helm template, Helm generally assumes the kubeVersion is v1.20.0 -# - On running a helm install --dry-run, the correct kubeVersion should be chosen. -kubeVersionOverrides: [] -# - constraint: "< 1.21" -# values: -# metricsPort: 10252 -# clients: -# https: -# enabled: false -# insecureSkipVerify: false -# useServiceAccountCredentials: false - -namespaceOverride: "" - -# The component that is being monitored (i.e. etcd) -component: "component" - -# The port containing the metrics that need to be scraped -metricsPort: 2739 - -# Configure ServiceMonitor that monitors metrics from the metricsPort endpoint -serviceMonitor: - enabled: true - # A list of endpoints that will be added to the ServiceMonitor based on the Endpoint spec - # Source: https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint - # By default, proxyUrl and params._scheme will be overridden based on other values - endpoints: - - port: metrics - -# Configure Service that grabs scrape targets -service: - # The selector that is used to populate the Service's Endpoints object. - # The chart will error out on rendering templating if .Values.clients.enabled is set alongside this field, - # since it is expected that this service should point to the PushProx Clients Daemonset / Deployment - selector: {} - -clients: - enabled: true - # The port which the PushProx client will post PushProx metrics to - port: 9369 - # If unset, this will default to the URL for the proxy service: http://pushprox-{{component}}-proxy.{{namepsace}}.svc.cluster.local:{{proxy.port}} - # Should be modified if the clients are being deployed outside the cluster where the proxy rests, otherwise leave it null - proxyUrl: "" - # If set to true, the client will forward any requests from the host IP to 127.0.0.1 - # It will only allow proxy requests to the metricsPort specified - useLocalhost: false - # Configuration for accessing metrics via HTTPS - https: - # Does the client require https to access the metrics? - enabled: false - # Does the client require requests be sent to http or https? - forceHTTPSScheme: false - # If set to true, the client will create a service account with adequate permissions and set a flag - # on the client to use the service account token provided by it to make authorized scrape requests - useServiceAccountCredentials: false - # Configuration for authentication to metrics via https endpoint - authenticationMethod: - # Reads token from defined file in container - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenFile: - enabled: false - bearerTokenFilePath: "/var/run/secrets/kubernetes.io/serviceaccount/token" - # Reads token from defined secret in namespace - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenSecret: - enabled: false - # Reads token from defined secret in namespace - authorization: - enabled: false - type: "bearer" - credentials: - key: "token" - optional: false - # If set to true, the client will disable SSL security checks - insecureSkipVerify: false - # Directory on host where necessary TLS cert and key to scrape metrics can be found - certDir: "" - # Filenames for files located in .Values.clients.https.certDir that correspond to TLS settings - certFile: "" - keyFile: "" - caCertFile: "" - # seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. - # Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. - seLinuxOptions: {} - - metrics: - # Whether the client should publish PushProx client-specific metrics to .Values.clients.port - enabled: false - - rbac: - # Additional permissions to provide to the ServiceAccount bound to the client - # This can be used to provide additional permissions for the client to scrape metrics from the k8s API - # Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true - additionalRules: [] - - # Resource limits - resources: {} - - # Options to select all nodes to deploy client DaemonSet on - nodeSelector: {} - tolerations: [] - affinity: {} - - image: - repository: rancher/pushprox-client - tag: v0.1.3-rancher2-client - command: ["pushprox-client"] - - copyCertsImage: - repository: rancher/mirrored-library-busybox - tag: 1.31.1 - - # The default intention of rancher-pushprox clients is to scrape hostNetwork metrics across all nodes. - # This can be used to scrape internal Kubernetes components or DaemonSets of hostNetwork Pods in - # situations where a cloud provider firewall prevents Pod-To-Host communication but not Pod-To-Pod. - # However, if the underlying hostNetwork Pod that is being scraped is managed by a Deployment, - # this advanced option enables users to deploy the client as a Deployment instead of a DaemonSet. - # If a user deploys this feature and the underlying Deployment's number of replicas changes, the user will - # be responsible for upgrading this chart accordingly to the right number of replicas. - deployment: - enabled: false - replicas: 0 - -proxy: - enabled: true - # The port through which PushProx clients will communicate to the proxy - port: 8080 - - # Resource limits - resources: {} - - # Options to select a node to run a single proxy deployment on - nodeSelector: {} - tolerations: [] - - image: - repository: rancher/pushprox-proxy - tag: v0.1.3-rancher2-proxy - command: ["pushprox-proxy"] diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/Chart.yaml deleted file mode 100644 index f9657aae26..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/Chart.yaml +++ /dev/null @@ -1,14 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/kube-version: '>= 1.23.0-0 < 1.29.0-0' - catalog.cattle.io/os: linux - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-pushprox -apiVersion: v1 -appVersion: 0.1.0 -description: Sets up a deployment of the PushProx proxy and a DaemonSet of PushProx - clients. -name: rkeScheduler -type: application -version: 0.2.0 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/README.md deleted file mode 100644 index 345002f48a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# rancher-pushprox - -A Rancher chart based on Rancher [PushProx](https://github.com/rancher/PushProx) that sets up a Deployment of a PushProx proxy and a DaemonSet of PushProx clients on a Kubernetes cluster. - -Installs [rancher-pushprox](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-pushprox) to create PushProx clients that can access their host's network and register with a PushProx proxy. A [Prometheus Operator](https://github.com/coreos/prometheus-operator) ServiceMonitor CR is also included that is configured to scrape the metrics from each of the clients through the proxy. - -Using an instance of this chart is suitable for the following scenarios: -- You need to scrape metrics from a port that should not be accessible outside of the host (e.g. scraping `etcd` metrics in a hardened cluster) -- You need to scrape metrics on a host that are not exposed outside of 127.0.0.1 (e.g. scraping `kube-proxy` metrics) -- You need to scrape metrics through HTTPS using certs hosted directly on `hostPath` -- You need to scrape metrics from Kubernetes components that require authorization via a service account (e.g. permissions to make request to `/metrics`) -- You need to scrape metrics without access to cacerts (i.e. enable `insecureSkipVerify`) - -The clients and proxy are created based on a Rancher fork of the [prometheus-community/PushProx](https://github.com/prometheus-community/PushProx) project. - -## Upgrading to Kubernetes v1.25+ - -Starting in Kubernetes v1.25, [Pod Security Policies](https://kubernetes.io/docs/concepts/security/pod-security-policy/) have been removed from the Kubernetes API. - -As a result, **before upgrading to Kubernetes v1.25** (or on a fresh install in a Kubernetes v1.25+ cluster), users are expected to perform an in-place upgrade of this chart with `global.cattle.psp.enabled` set to `false` if it has been previously set to `true`. -​ -> **Note:** -> In this chart release, any previous field that was associated with any PSP resources have been removed in favor of a single global field: `global.cattle.psp.enabled`. - -> **Note:** -> If you upgrade your cluster to Kubernetes v1.25+ before removing PSPs via a `helm upgrade` (even if you manually clean up resources), **it will leave the Helm release in a broken state within the cluster such that further Helm operations will not work (`helm uninstall`, `helm upgrade`, etc.).** -> -> If your charts get stuck in this state, please consult the Rancher docs on how to clean up your Helm release secrets. - -Upon setting `global.cattle.psp.enabled` to false, the chart will remove any PSP resources deployed on its behalf from the cluster. This is the default setting for this chart. - -As a replacement for PSPs, [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) should be used. Please consult the Rancher docs for more details on how to configure your chart release namespaces to work with the new Pod Security Admission and apply Pod Security Standards. - -## Configuration - -The following tables list the configurable parameters of the rancher-pushprox chart and their default values. - -### General - -#### Required -| Parameter | Description | Example | -| ----- | ----------- | ------ | -| `component` | The component that is being monitored | `kube-etcd` -| `metricsPort` | The port on the host that contains the metrics you want to scrape (e.g. `http://:/metrics`) | `2379` | -| `namespaceOverride` | The namespace to install the chart | `""` - -#### Optional -| Parameter | Description | Default | -| ----- | ----------- | ------ | -| `serviceMonitor.enabled` | Deploys a [Prometheus Operator](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor) ServiceMonitor CR that is configured to scrape metrics on the hosts that the clients are deployed on via the proxy. Also deploys a Service that points to all pods with the expected client name that exposes the `metricsPort` selected | `true` | -| `serviceMonitor.endpoints` | A list of endpoints that will be added to the ServiceMonitor based on the [Endpoint spec](https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint) | `[{port: metrics}]` | -| `service.selector` | The selector that is used to populate the Service's Endpoints object. The chart will error out on rendering templating if `.Values.clients.enabled` is set alongside this field, since it is expected that this service should point to the PushProx Clients Daemonset / Deployment | `{}` | -| `clients.enabled` | Deploys a DaemonSet of clients that are each capable of scraping endpoints on the hostNetwork it is deployed on | `true` | -| `clients.port` | The port where the client will publish PushProx client-specific metrics. If deploying multiple clients onto the same node, the clients should not have conflicting ports | `9369` | -| `clients.proxyUrl` | Overrides the default proxyUrl setting of `http://pushprox-{{ .Values.component }}-proxy.{{ . Release.Namespace }}.svc.cluster.local:{{ .Values.proxy.port }}"` with the `proxyUrl` specified | `""` | -| `clients.useLocalhost` | Sets a flag on each client deployment to redirect scrapes directed to `HOST_IP` to `127.0.0.1` | `false` | -| `clients.https.enabled` | Enables scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.forceHTTPSScheme` | Forces scraping metrics via HTTPS using the provided TLS certs that exist on each host | `false` | -| `clients.https.useServiceAccountCredentials` | If set to true, the client will create a service account with permissions to scrape `/metrics` endpoint of Kubernetes components. The client will use the service account token provided to make authorized scrape requests to the Kubernetes API | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.enabled` | If set to true, the client will use service account credentials mounted at the configured path `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath`. This requires permissions to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath` | This is a volume mount on the pod with permissions to scrape `/metrics` endpoint of Kubernetes components | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | -| `clients.https.authenticationMethod.bearerTokenSecret.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components. This method is deprecated by the prometheus operator and may be removed in a future release | `false` | -| `clients.https.authenticationMethod.authorization.enabled` | If set to true, the client will use service account credentials to scrape `/metrics` endpoint of Kubernetes components | `false` | -| `clients.https.authenticationMethod.authorization.type` | If set, the client will use this type of authorization in its client requests for metrics | `"bearer"` | -| `clients.https.authenticationMethod.authorization.credentials.key` | If set, the client will use this key in the secret created by `clients.https.useServiceAccountCredentials` for authorization in its client requests for metrics | `"token"` | -| `clients.https.authenticationMethod.authorization.credentials.optional` | If set to false, the client will fail if the key in the secret created by `clients.https.useServiceAccountCredentials` does not exist | `false` | -| `clients.https.insecureSkipVerify` | If set to true, the client will disable SSL security checks | `false` | -| `clients.https.certDir` | A `hostPath` where TLS certs can be found. This path is mounted as a volume on an `initContainer` which copies only the necessary files over to an EmptyDir volume used by each client. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.certFile` | The path to the TLS cert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.keyFile` | The path to the TLS key file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.caCertFile` | The path to the TLS cacert file located within `clients.https.certDir`. Required and only used if `clients.https.enabled` is set | `""` | -| `clients.https.seLinuxOptions` | seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. | `""` | -| `clients.metrics.enabled` | Whether the client should publish PushProx client-specific metrics. | `false` | -| `clients.rbac.additionalRules` | Additional permissions to provide to the ServiceAccount bound to the client. This can be used to provide additional permissions for the client to scrape metrics from the k8s API. Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true | `[]` | -| `clients.deployment.enabled` | Deploys the client as a Deployment (generally used if the underlying hostNetwork Pod that is being scraped is managed by a Deployment) | `false` | -| `clients.deployment.replicas` | The number of pods the Deployment has, it should match the number of pod the hostNetwork Deployment has. Required and only used if `client.deployment.enable` is set | `0` | -| `clients.deployment.affinity` | The affinity rules that allocate the pod to the node in which the hostNetwork Deployment's pods run. Required and only used if `client.deployment.enable` is set | `{}` | -| `clients.resources` | Set resource limits and requests for the client container | `{}` | -| `clients.nodeSelector` | Select which nodes to deploy the clients on | `{}` | -| `clients.tolerations` | Specify tolerations for clients | `[]` | -| `proxy.enabled` | Deploys the proxy that each client will register with | `true` | -| `proxy.port` | The port exposed by the proxy that each client will register with to allow metrics to be scraped from the host | `8080` | -| `proxy.resources` | Set resource limits and requests for the proxy container | `{}` | -| `proxy.nodeSelector` | Select which nodes the proxy can be deployed on | `{}` | -| `proxy.tolerations` | Specify tolerations (if necessary) to allow the proxy to be deployed on the selected node | `[]` | -| `kubeVersionOverrides` | A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches any of the semver constraints provided as keys on the map. On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. | `[]` - -*Tip: The filepaths set in `clients.https.File` can include wildcard characters*. - -See [rancher-monitoring](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-monitoring) for examples of how this chart can be used. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/_helpers.tpl deleted file mode 100644 index 8e651dccfd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/_helpers.tpl +++ /dev/null @@ -1,166 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# General - -{{- define "applyKubeVersionOverrides" -}} -{{- $overrides := dict -}} -{{- range $override := .Values.kubeVersionOverrides -}} -{{- if semverCompare $override.constraint $.Capabilities.KubeVersion.Version -}} -{{- $_ := mergeOverwrite $overrides $override.values -}} -{{- end -}} -{{- end -}} -{{- $_ := mergeOverwrite .Values $overrides -}} -{{- end -}} - -{{- define "pushprox.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{- define "pushProxy.commonLabels" -}} -release: {{ .Release.Name }} -component: {{ .Values.component | quote }} -provider: kubernetes -{{- end -}} - -{{- define "pushProxy.proxyUrl" -}} -{{- $_ := (required "Template requires either .Values.proxy.port or .Values.client.proxyUrl to set proxyUrl for client" (or .Values.clients.proxyUrl .Values.proxy.port)) -}} -{{- if .Values.clients.proxyUrl -}} -{{ printf "%s" .Values.clients.proxyUrl }} -{{- else -}} -{{ printf "http://%s.%s.svc:%d" (include "pushProxy.proxy.name" .) (include "pushprox.namespace" .) (int .Values.proxy.port) }} -{{- end -}}{{- end -}} - -# Client - -{{- define "pushProxy.client.name" -}} -{{- printf "pushprox-%s-client" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.serviceAccountTokenName" -}} -{{- printf "pushprox-%s-client-service-account-token" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.client.labels" -}} -k8s-app: {{ template "pushProxy.client.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# Proxy - -{{- define "pushProxy.proxy.name" -}} -{{- printf "pushprox-%s-proxy" (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.proxy.labels" -}} -k8s-app: {{ template "pushProxy.proxy.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -# ServiceMonitor - -{{- define "pushprox.serviceMonitor.name" -}} -{{- printf "%s-%s" .Release.Name (required ".Values.component is required" .Values.component) -}} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.labels" -}} -app: {{ template "pushprox.serviceMonitor.name" . }} -{{ template "pushProxy.commonLabels" . }} -{{- end -}} - -{{- define "pushProxy.serviceMonitor.endpoints" -}} -{{- $proxyURL := (include "pushProxy.proxyUrl" .) -}} -{{- $useHTTPS := .Values.clients.https.enabled -}} -{{- $forceHTTPSScheme := .Values.clients.https.forceHTTPSScheme -}} -{{- $insecureSkipVerify := .Values.clients.https.insecureSkipVerify -}} -{{- $useServiceAccountCredentials := .Values.clients.https.useServiceAccountCredentials -}} -{{- $serviceAccountTokenName := (include "pushProxy.client.serviceAccountTokenName" . ) -}} -{{- $metricRelabelings := list }} -{{- $endpoints := .Values.serviceMonitor.endpoints }} -{{- range $endpoints }} -{{- if $.Values.proxy.enabled }} -{{- $_ := set . "proxyUrl" $proxyURL }} -{{- end }} -{{- $clusterIdRelabel := dict }} -{{- if $.Values.global.cattle.clusterId }} -{{- $_ := set $clusterIdRelabel "action" "replace" }} -{{- $_ := set $clusterIdRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterIdRelabel "targetLabel" "cluster_id" }} -{{- $_ := set $clusterIdRelabel "replacement" $.Values.global.cattle.clusterId }} -{{- end }} -{{- $clusterNameRelabel := dict }} -{{- if $.Values.global.cattle.clusterName }} -{{- $_ := set $clusterNameRelabel "action" "replace" }} -{{- $_ := set $clusterNameRelabel "sourceLabels" (list "__address__") }} -{{- $_ := set $clusterNameRelabel "targetLabel" "cluster_name" }} -{{- $_ := set $clusterNameRelabel "replacement" $.Values.global.cattle.clusterName }} -{{- end }} -{{- $metricRelabelings := gt (len (keys $clusterNameRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterNameRelabel)) ($metricRelabelings) }} -{{- $metricRelabelings := gt (len (keys $clusterIdRelabel)) 0 | ternary (append ($metricRelabelings) ($clusterIdRelabel)) ($metricRelabelings) }} -{{- if not (empty $metricRelabelings) }} -{{- $_ := set . "metricRelabelings" ($metricRelabelings)}} -{{- end }} -{{- if $forceHTTPSScheme -}} -{{- $_ := set . "scheme" "https" }} -{{- end -}} -{{- if $useHTTPS -}} -{{- if (hasKey . "params") }} -{{- $_ := set (get . "params") "_scheme" (list "https") }} -{{- else }} -{{- $_ := set . "params" (dict "_scheme" (list "https")) }} -{{- end }} -{{- end }} -{{- if (hasKey . "tlsConfig") }} -{{- $_ := set (get . "tlsConfig") "insecureSkipVerify" $insecureSkipVerify }} -{{- else }} -{{- $_ := set . "tlsConfig" (dict "insecureSkipVerify" $insecureSkipVerify) }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenFile.enabled }} -{{- $_ := set . "bearerTokenFile" $.Values.clients.https.authenticationMethod.bearerTokenFile.bearerTokenFilePath }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.bearerTokenSecret.enabled }} -{{- $_ := set . "bearerTokenSecret" $serviceAccountTokenName }} -{{- end }} -{{- if $.Values.clients.https.authenticationMethod.authorization.enabled }} -{{- if (hasKey . "authorization") }} -{{- $_ := set (get . "authorization") "type" $.Values.clients.https.authenticationMethod.authorization.type }} -{{- $_ := set (get . "authorization") "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional) }} -{{- else }} -{{- $_ := set . "authorization" (dict "type" $.Values.clients.https.authenticationMethod.authorization.type) }} -{{- $_ := set . "authorization" (dict "credentials" (dict "name" $serviceAccountTokenName "key" $.Values.clients.https.authenticationMethod.authorization.credentials.key "optional" $.Values.clients.https.authenticationMethod.authorization.credentials.optional)) }} -{{- end }} -{{- end }} -{{- end }} -{{- toYaml $endpoints }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-clients-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-clients-rbac.yaml deleted file mode 100644 index a8e27c3735..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-clients-rbac.yaml +++ /dev/null @@ -1,97 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.client.name" . }} -{{- end }} -{{- if and .Values.clients.https.enabled .Values.clients.https.useServiceAccountCredentials }} -- nonResourceURLs: ["/metrics"] - verbs: ["get"] -{{- if .Values.clients.rbac.additionalRules }} -{{ toYaml .Values.clients.rbac.additionalRules }} -{{- end }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.client.name" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.client.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} ---- -{{- if .Values.clients.https.useServiceAccountCredentials }} -apiVersion: v1 -kind: Secret -type: kubernetes.io/service-account-token -metadata: - name: {{ template "pushProxy.client.serviceAccountTokenName" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - annotations: - kubernetes.io/service-account.name: {{ template "pushProxy.client.name" . }} -{{- end }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: true - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 6 }} -{{- end }} - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - - 'emptyDir' - - 'hostPath' - allowedHostPaths: - - pathPrefix: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - readOnly: true -{{- end }} -{{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-clients.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-clients.yaml deleted file mode 100644 index e8fcfb3883..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-clients.yaml +++ /dev/null @@ -1,157 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.clients }}{{- if .Values.clients.enabled }} -apiVersion: apps/v1 -{{- if .Values.clients.deployment.enabled }} -kind: Deployment -{{- else }} -kind: DaemonSet -{{- end }} -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} - pushprox-exporter: "client" -spec: - {{- if .Values.clients.deployment.enabled }} - replicas: {{ .Values.clients.deployment.replicas }} - {{- end }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.client.labels" . | nindent 8 }} - spec: - {{- if .Values.clients.affinity }} - affinity: {{ toYaml .Values.clients.affinity | nindent 8 }} - {{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.clients.nodeSelector }} -{{ toYaml .Values.clients.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.clients.tolerations }} -{{ toYaml .Values.clients.tolerations | indent 8 }} -{{- end }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - serviceAccountName: {{ template "pushProxy.client.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-client - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - {{- range .Values.clients.command }} - - {{ . | quote }} - {{- end }} - args: - - --fqdn=$(HOST_IP) - - --proxy-url=$(PROXY_URL) - {{- if .Values.clients.metrics.enabled }} - - --metrics-addr=$(PORT) - {{- end }} - - --allow-port={{ required "Need .Values.metricsPort to configure client to be allowed to scrape metrics at port" .Values.metricsPort}} - {{- if .Values.clients.useLocalhost }} - - --use-localhost - {{- end }} - {{- if .Values.clients.https.enabled }} - {{- if .Values.clients.https.insecureSkipVerify }} - - --insecure-skip-verify - {{- end }} - {{- if .Values.clients.https.useServiceAccountCredentials }} - - --token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- end }} - {{- if .Values.clients.https.certDir }} - - --tls.cert=/etc/ssl/push-proxy/push-proxy.pem - - --tls.key=/etc/ssl/push-proxy/push-proxy-key.pem - - --tls.cacert=/etc/ssl/push-proxy/push-proxy-ca-cert.pem - {{- end }} - {{- end }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if .Values.clients.metrics.enabled }} - - name: PORT - value: :{{ .Values.clients.port }} - {{- end }} - - name: PROXY_URL - value: {{ template "pushProxy.proxyUrl" . }} - securityContext: - runAsNonRoot: true - runAsUser: 1000 - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - volumeMounts: - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - {{- end }} - {{- if .Values.clients.resources }} - resources: {{ toYaml .Values.clients.resources | nindent 10 }} - {{- end }} - {{- if and .Values.clients.https.enabled .Values.clients.https.certDir }} - initContainers: - - name: copy-certs - image: {{ template "system_default_registry" . }}{{ .Values.clients.copyCertsImage.repository }}:{{ .Values.clients.copyCertsImage.tag }} - command: - - sh - - -c - - | - echo "Searching for files to copy within the source volume" - echo "cert: ${CERT_FILE_NAME}" - echo "key: ${KEY_FILE_NAME}" - echo "cacert: ${CACERT_FILE_NAME}" - - CERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CERT_FILE_NAME}" | sort -r | head -n 1) - KEY_FILE_SOURCE=$(find /etc/source/ -type f -name "${KEY_FILE_NAME}" | sort -r | head -n 1) - CACERT_FILE_SOURCE=$(find /etc/source/ -type f -name "${CACERT_FILE_NAME}" | sort -r | head -n 1) - - test -z ${CERT_FILE_SOURCE} && echo "Failed to find cert file" && exit 1 - test -z ${KEY_FILE_SOURCE} && echo "Failed to find key file" && exit 1 - test -z ${CACERT_FILE_SOURCE} && echo "Failed to find cacert file" && exit 1 - - echo "Copying cert file from $CERT_FILE_SOURCE to $CERT_FILE_TARGET" - cp $CERT_FILE_SOURCE $CERT_FILE_TARGET || exit 1 - chmod 444 $CERT_FILE_TARGET || exit 1 - - echo "Copying key file from $KEY_FILE_SOURCE to $KEY_FILE_TARGET" - cp $KEY_FILE_SOURCE $KEY_FILE_TARGET || exit 1 - chmod 444 $KEY_FILE_TARGET || exit 1 - - echo "Copying cacert file from $CACERT_FILE_SOURCE to $CACERT_FILE_TARGET" - cp $CACERT_FILE_SOURCE $CACERT_FILE_TARGET || exit 1 - chmod 444 $CACERT_FILE_TARGET || exit 1 - env: - - name: CERT_FILE_NAME - value: {{ required "Need a TLS cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.certFile }} - - name: KEY_FILE_NAME - value: {{ required "Need a TLS key file for scraping metrics endpoint over HTTPs" .Values.clients.https.keyFile }} - - name: CACERT_FILE_NAME - value: {{ required "Need a TLS CA cert file for scraping metrics endpoint over HTTPs" .Values.clients.https.caCertFile }} - - name: CERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy.pem - - name: KEY_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-key.pem - - name: CACERT_FILE_TARGET - value: /etc/ssl/push-proxy/push-proxy-ca-cert.pem - securityContext: - runAsNonRoot: false -{{- if and .Values.global.seLinux.enabled .Values.clients.https.seLinuxOptions }} - seLinuxOptions: {{ .Values.clients.https.seLinuxOptions | toYaml | nindent 12 }} -{{- end }} - volumeMounts: - - name: metrics-cert-dir-source - mountPath: /etc/source - readOnly: true - - name: metrics-cert-dir - mountPath: /etc/ssl/push-proxy - volumes: - - name: metrics-cert-dir-source - hostPath: - path: {{ required "Need access to volume on host with the SSL cert files to use HTTPs" .Values.clients.https.certDir }} - - name: metrics-cert-dir - emptyDir: {} - {{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-proxy-rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-proxy-rbac.yaml deleted file mode 100644 index eefe609058..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-proxy-rbac.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "pushProxy.proxy.name" . }} -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "pushProxy.proxy.name" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "pushProxy.proxy.name" . }} -subjects: - - kind: ServiceAccount - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ include "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- end }}{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-proxy.yaml deleted file mode 100644 index 723bbd6c00..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-proxy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if and .Values.proxy }}{{ if .Values.proxy.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} - pushprox-exporter: "proxy" -spec: - selector: - matchLabels: {{ include "pushProxy.proxy.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "pushProxy.proxy.labels" . | nindent 8 }} - spec: - securityContext: - runAsNonRoot: true - runAsUser: 1000 - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- if .Values.proxy.nodeSelector }} -{{ toYaml .Values.proxy.nodeSelector | indent 8 }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- if .Values.proxy.tolerations }} -{{ toYaml .Values.proxy.tolerations | indent 8 }} -{{- end }} - serviceAccountName: {{ template "pushProxy.proxy.name" . }} - {{- if .Values.global.imagePullSecretName }} - imagePullSecrets: - - name: {{ .Values.global.imagePullSecretName }} - {{- end }} - containers: - - name: pushprox-proxy - image: {{ template "system_default_registry" . }}{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag }} - command: - {{- range .Values.proxy.command }} - - {{ . | quote }} - {{- end }} - {{- if .Values.proxy.resources }} - resources: {{ toYaml .Values.proxy.resources | nindent 10 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.proxy.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -spec: - ports: - - name: pp-proxy - port: {{ required "Need .Values.proxy.port to configure proxy" .Values.proxy.port }} - protocol: TCP - targetPort: {{ .Values.proxy.port }} - selector: {{ include "pushProxy.proxy.labels" . | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-servicemonitor.yaml deleted file mode 100644 index 67eb2216b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/pushprox-servicemonitor.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- template "applyKubeVersionOverrides" . -}} -{{- if .Values.serviceMonitor }}{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "pushprox.serviceMonitor.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.serviceMonitor.labels" . | nindent 4 }} -spec: - endpoints: {{include "pushProxy.serviceMonitor.endpoints" . | nindent 4 }} - jobLabel: component - podTargetLabels: - - component - - pushprox-exporter - namespaceSelector: - matchNames: - - {{ template "pushprox.namespace" . }} - selector: - matchLabels: {{ include "pushProxy.client.labels" . | nindent 6 }} ---- -{{- $selector := "" }} -{{- if not (kindIs "invalid" .Values.service) }} -{{- if not (kindIs "invalid" .Values.service.selector) }} -{{ if .Values.service.selector }} -{{- if .Values.clients.enabled }} -{{- required (printf "Cannot override .Values.service.selector=%s when .Values.clients.enabled=true" (toJson .Values.service.selector)) "" }} -{{- end }} -{{- $selector = (toYaml .Values.service.selector) }} -{{- end }} -{{- end }} -{{- end }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "pushProxy.client.name" . }} - namespace: {{ template "pushprox.namespace" . }} - labels: {{ include "pushProxy.client.labels" . | nindent 4 }} -spec: - ports: - - name: metrics - port: {{ required "Need .Values.metricsPort to configure client to listen to metrics at port" .Values.metricsPort}} - protocol: TCP - targetPort: {{ .Values.metricsPort }} - selector: {{ default (include "pushProxy.client.labels" .) $selector | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/validate-install-crd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/validate-install-crd.yaml deleted file mode 100644 index 16abc2fa83..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/validate-install-crd.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -# {{- $found := dict -}} -# {{- set $found "monitoring.coreos.com/v1/ServiceMonitor" false -}} -# {{- range .Capabilities.APIVersions -}} -# {{- if hasKey $found (toString .) -}} -# {{- set $found (toString .) true -}} -# {{- end -}} -# {{- end -}} -# {{- range $_, $exists := $found -}} -# {{- if (eq $exists false) -}} -# {{- required "Required CRDs are missing. Please install Prometheus Operator CRDs before installing this chart." "" -}} -# {{- end -}} -# {{- end -}} -#{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/validate-psp-install.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/values.yaml deleted file mode 100644 index 1e076041b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/rkeScheduler/values.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# Default values for rancher-pushprox. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Default image containing both the proxy and the client was generated from the following Dockerfile -# https://github.com/prometheus-community/PushProx/blob/eeadbe766641699129920ccfaaaa30a85c67fe81/Dockerfile#L1-L15 - -# Configuration - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - seLinux: - enabled: false - -# A list of Semver constraint strings (defined by https://github.com/Masterminds/semver) and values.yaml overrides. -# -# For each key in kubeVersionOverrides, this chart will check to see if the current Kubernetes cluster's version matches -# any of the semver constraints provided as keys on the map. -# -# On seeing a match, the default value for each values.yaml field overridden will be updated with the new value. -# -# If multiple matches are encountered (due to overlapping semver ranges), the matches will be applied in order. -# -# Notes: -# - On running a helm template, Helm generally assumes the kubeVersion is v1.20.0 -# - On running a helm install --dry-run, the correct kubeVersion should be chosen. -kubeVersionOverrides: [] -# - constraint: "< 1.21" -# values: -# metricsPort: 10252 -# clients: -# https: -# enabled: false -# insecureSkipVerify: false -# useServiceAccountCredentials: false - -namespaceOverride: "" - -# The component that is being monitored (i.e. etcd) -component: "component" - -# The port containing the metrics that need to be scraped -metricsPort: 2739 - -# Configure ServiceMonitor that monitors metrics from the metricsPort endpoint -serviceMonitor: - enabled: true - # A list of endpoints that will be added to the ServiceMonitor based on the Endpoint spec - # Source: https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#endpoint - # By default, proxyUrl and params._scheme will be overridden based on other values - endpoints: - - port: metrics - -# Configure Service that grabs scrape targets -service: - # The selector that is used to populate the Service's Endpoints object. - # The chart will error out on rendering templating if .Values.clients.enabled is set alongside this field, - # since it is expected that this service should point to the PushProx Clients Daemonset / Deployment - selector: {} - -clients: - enabled: true - # The port which the PushProx client will post PushProx metrics to - port: 9369 - # If unset, this will default to the URL for the proxy service: http://pushprox-{{component}}-proxy.{{namepsace}}.svc.cluster.local:{{proxy.port}} - # Should be modified if the clients are being deployed outside the cluster where the proxy rests, otherwise leave it null - proxyUrl: "" - # If set to true, the client will forward any requests from the host IP to 127.0.0.1 - # It will only allow proxy requests to the metricsPort specified - useLocalhost: false - # Configuration for accessing metrics via HTTPS - https: - # Does the client require https to access the metrics? - enabled: false - # Does the client require requests be sent to http or https? - forceHTTPSScheme: false - # If set to true, the client will create a service account with adequate permissions and set a flag - # on the client to use the service account token provided by it to make authorized scrape requests - useServiceAccountCredentials: false - # Configuration for authentication to metrics via https endpoint - authenticationMethod: - # Reads token from defined file in container - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenFile: - enabled: false - bearerTokenFilePath: "/var/run/secrets/kubernetes.io/serviceaccount/token" - # Reads token from defined secret in namespace - # This function is deprecated in the prometheus operator api and may be removed in a future version - bearerTokenSecret: - enabled: false - # Reads token from defined secret in namespace - authorization: - enabled: false - type: "bearer" - credentials: - key: "token" - optional: false - # If set to true, the client will disable SSL security checks - insecureSkipVerify: false - # Directory on host where necessary TLS cert and key to scrape metrics can be found - certDir: "" - # Filenames for files located in .Values.clients.https.certDir that correspond to TLS settings - certFile: "" - keyFile: "" - caCertFile: "" - # seLinuxOptions to be passed into the container that copies certs. Should define a container with permissions to read the files in the certDir provided on the host. - # Required and only used if `clients.https.enabled` is set and `clients.https.certDir` is provided. - seLinuxOptions: {} - - metrics: - # Whether the client should publish PushProx client-specific metrics to .Values.clients.port - enabled: false - - rbac: - # Additional permissions to provide to the ServiceAccount bound to the client - # This can be used to provide additional permissions for the client to scrape metrics from the k8s API - # Only enabled if clients.https.enabled and clients.https.useServiceAccountCredentials are true - additionalRules: [] - - # Resource limits - resources: {} - - # Options to select all nodes to deploy client DaemonSet on - nodeSelector: {} - tolerations: [] - affinity: {} - - image: - repository: rancher/pushprox-client - tag: v0.1.3-rancher2-client - command: ["pushprox-client"] - - copyCertsImage: - repository: rancher/mirrored-library-busybox - tag: 1.31.1 - - # The default intention of rancher-pushprox clients is to scrape hostNetwork metrics across all nodes. - # This can be used to scrape internal Kubernetes components or DaemonSets of hostNetwork Pods in - # situations where a cloud provider firewall prevents Pod-To-Host communication but not Pod-To-Pod. - # However, if the underlying hostNetwork Pod that is being scraped is managed by a Deployment, - # this advanced option enables users to deploy the client as a Deployment instead of a DaemonSet. - # If a user deploys this feature and the underlying Deployment's number of replicas changes, the user will - # be responsible for upgrading this chart accordingly to the right number of replicas. - deployment: - enabled: false - replicas: 0 - -proxy: - enabled: true - # The port through which PushProx clients will communicate to the proxy - port: 8080 - - # Resource limits - resources: {} - - # Options to select a node to run a single proxy deployment on - nodeSelector: {} - tolerations: [] - - image: - repository: rancher/pushprox-proxy - tag: v0.1.3-rancher2-proxy - command: ["pushprox-proxy"] diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/.helmignore b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/Chart.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/Chart.yaml deleted file mode 100644 index f1cc32344e..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/Chart.yaml +++ /dev/null @@ -1,15 +0,0 @@ -annotations: - catalog.cattle.io/hidden: "true" - catalog.cattle.io/os: windows - catalog.rancher.io/certified: rancher - catalog.rancher.io/namespace: cattle-monitoring-system - catalog.rancher.io/release-name: rancher-windows-exporter -apiVersion: v1 -appVersion: 0.0.2 -description: Sets up monitoring metrics from Windows nodes via Prometheus windows-exporter -maintainers: -- email: arvind.iyengar@rancher.com - name: aiyengar2 -name: windowsExporter -type: application -version: 0.1.1 diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/README.md b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/README.md deleted file mode 100644 index 6115b6f257..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# rancher-windows-exporter - -A Rancher chart based on the [prometheus-community/windows-exporter](https://github.com/prometheus-community/windows_exporter) project (previously called wmi-exporter) that sets up a DaemonSet of clients that can scrape windows-exporter metrics from Windows nodes on a Kubernetes cluster. - -A [Prometheus Operator](https://github.com/coreos/prometheus-operator) ServiceMonitor CR and PrometheusRule CR are also created by this chart to collect metrics and add some recording rules to map `windows_` series with their OS-agnostic counterparts. - -## Node Requirements - -Since Windows does not support privileged pods, this chart expects a Named Pipe (`\\.\pipe\rancher_wins`) to exist on the Windows host that allows containers to communicate with the host. This is done by deploying a [rancher/wins](https://github.com/rancher/wins) server on the host. - -The image used by the chart, [windows_exporter-package](https://github.com/rancher/windows_exporter-package), is configured to create a wins client that communicates with the wins server, alongside a running copy of a particular version of [windows-exporter](https://github.com/prometheus-community/windows_exporter). Through the wins client and wins server, the windows-exporter is able to communicate directly with the Windows host to collect metrics and expose them. - -If the cluster you are installing this chart on is a custom cluster that was created via RKE1 with Windows Support enabled, your nodes should already have the wins server running; this should have been added as part of [the bootstrapping process for adding the Windows node onto your RKE1 cluster](https://github.com/rancher/rancher/blob/master/package/windows/bootstrap.ps1). - -## Configuration - -See [rancher-monitoring](https://github.com/rancher/charts/tree/gh-pages/packages/rancher-monitoring) for an example of how this chart can be used. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/scripts/configure-firewall.ps1 b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/scripts/configure-firewall.ps1 deleted file mode 100644 index 9cbed7112d..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/scripts/configure-firewall.ps1 +++ /dev/null @@ -1,31 +0,0 @@ -$ErrorActionPreference = 'Continue' - -function CheckFirewallRuleError { - # We hit an error. This can happen for a number of reasons, including if the rule already exists - if ($error[0]) { - if (($error[0].Exception.NativeErrorCode) -and ($error[0].Exception.NativeErrorCode.ToString() -eq "AlreadyExists")) { - # Previous versions of monitoring may have already created this Firewall Rule - # Because of this, if the rule alreadys exists there is no need to delete and recreate it. - Write-Host "Detected Existing Firewall Rule, Nothing To Do" - } else { - Write-Host "Error Encountered Setting Up Required Firewall Rule" - $error[0].Exception - exit 1 - } - } -} - -Write-Host "Attempting To Configure Firewall Rules For Ports 9796, 10250" - -# This is the exact same firewall rule that has historically been created by rancher-wins -# https://github.com/rancher/wins/blob/91f670c47f19c6d9fe97d8f66a695d3081ad994f/pkg/apis/process_service_mgmt.go#L149 -New-NetFirewallRule -DisplayName rancher-wins-windows-exporter-TCP-9796 -Name rancher-wins-windows-exporter-TCP-9796 -Action Allow -Protocol TCP -LocalPort 9796 -Enabled True -PolicyStore ActiveStore -CheckFirewallRuleError -Write-Host "Windows Node Exporter Firewall Rule Successfully Created" - -# This rule is required in order to have the Rancher UI display node metrics in the 'Nodes' tab of the cluster explorer -New-NetFirewallRule -DisplayName rancher-wins-windows-exporter-TCP-10250 -Name rancher-wins-windows-exporter-TCP-10250 -Action Allow -Protocol TCP -LocalPort 10250 -Enabled True -PolicyStore ActiveStore -CheckFirewallRuleError -Write-Host "Windows Prometheus Metrics Firewall Rule Successfully Created" - -Write-Host "All Firewall Rules Successfully Configured" diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/scripts/ensure-9796-is-free.ps1 b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/scripts/ensure-9796-is-free.ps1 deleted file mode 100644 index a5ccf1e745..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/scripts/ensure-9796-is-free.ps1 +++ /dev/null @@ -1,28 +0,0 @@ -$ErrorActionPreference = 'Continue' - -# Previous installations of monitoring may have used wins to deploy the windows_node-exporter. -# If this is the case, then port 9796 is likely still occupied by the process spawned from wins -# (even though the old verson of monitoring has been uninstalled / upgraded). Since we need to continue -# to use port 9796, we have clean up the old process before starting the exporter container. -$existingProcess = $(Get-Process -Id (Get-NetTCPConnection -LocalPort 9796).OwningProcess) - -# Port is free, nothing to do -if (-not $existingProcess) { - exit 0 -} - -# If windows_node-exporter was launched from rancher wins the process name will alwawys -# be prefixed with 'rancher-wins-' (https://github.com/rancher/wins/blob/91f670c47f19c6d9fe97d8f66a695d3081ad994f/pkg/apis/process_service.go#L20) -# Instances of windows-exporter not launched from wins will simply be titled 'windows-exporter'. -if ($existingProcess.Name -eq "rancher-wins-windows-exporter") { - Write-Host "Cleaning up outdated windows-node-exporter process spawned from rancher-wins" - Stop-Process $existingProcess.Id - Write-Host "Successfully removed outdated windows-node-exporter process" -} - -# If this is the first time monitoring is being installed onto a cluster but an unrelated process -# is occupying port 9796, we need to error out and state that the required port is not free. -if (-not ($existingProcess.Name -like "rancher")) { - Write-Host Error encountered setting up windows_node-exporter. An unrelated process is occupying required port 9796 ($existingProcess.Name). Port 9796 must be available in order to install rancher-monitoring. - exit 1 -} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/_helpers.tpl deleted file mode 100644 index 5db4a8c34e..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/_helpers.tpl +++ /dev/null @@ -1,107 +0,0 @@ -# Rancher - -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -# General - -{{/* -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. -The components in this chart create additional resources that expand the longest created name strings. -The longest name that gets created adds and extra 37 characters, so truncation should be 63-35=26. -*/}} -{{- define "windowsExporter.name" -}} -{{ printf "%s-windows-exporter" .Release.Name }} -{{- end -}} - -{{- define "windowsExporter.namespace" -}} -{{- default .Release.Namespace .Values.namespaceOverride -}} -{{- end -}} - -{{- define "windowsExporter.labels" -}} -k8s-app: {{ template "windowsExporter.name" . }} -release: {{ .Release.Name }} -component: "windows-exporter" -provider: kubernetes -{{- end -}} - -# Client - -{{- define "windowsExporter.client.nodeSelector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: windows -{{- else -}} -kubernetes.io/os: windows -{{- end -}} -{{- if .Values.clients.nodeSelector }} -{{ toYaml .Values.clients.nodeSelector }} -{{- end }} -{{- end -}} - -{{- define "windowsExporter.client.tolerations" -}} -{{- if .Values.clients.tolerations -}} -{{ toYaml .Values.clients.tolerations }} -{{- else -}} -- operator: Exists -{{- end -}} -{{- end -}} - -{{- define "windowsExporter.client.env" -}} -{{- if .Values.clients.env }} -{{ toYaml .Values.clients.env }} -{{- end }} -{{- end -}} - -{{- define "windowsExporter.validatePathPrefix" -}} -{{- if .Values.global.cattle.rkeWindowsPathPrefix -}} -{{- $prefixPath := (.Values.global.cattle.rkeWindowsPathPrefix | replace "/" "\\") -}} -{{- if (not (hasSuffix "\\" $prefixPath)) -}} -{{- fail (printf ".Values.global.cattle.rkeWindowsPathPrefix must end in '/' or '\\', found %s" $prefixPath) -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{- define "windowsExporter.renamedMetrics" -}} -{{- $renamed := dict -}} -{{/* v0.15.0 */}} -{{- $_ := set $renamed "windows_mssql_transactions_active_total" "windows_mssql_transactions_active" -}} -{{/* v0.16.0 */}} -{{- $_ := set $renamed "windows_adfs_ad_login_connection_failures" "windows_adfs_ad_login_connection_failures_total" -}} -{{- $_ := set $renamed "windows_adfs_certificate_authentications" "windows_adfs_certificate_authentications_total" -}} -{{- $_ := set $renamed "windows_adfs_device_authentications" "windows_adfs_device_authentications_total" -}} -{{- $_ := set $renamed "windows_adfs_extranet_account_lockouts" "windows_adfs_extranet_account_lockouts_total" -}} -{{- $_ := set $renamed "windows_adfs_federated_authentications" "windows_adfs_federated_authentications_total" -}} -{{- $_ := set $renamed "windows_adfs_passport_authentications" "windows_adfs_passport_authentications_total" -}} -{{- $_ := set $renamed "windows_adfs_password_change_failed" "windows_adfs_password_change_failed_total" -}} -{{- $_ := set $renamed "windows_adfs_password_change_succeeded" "windows_adfs_password_change_succeeded_total" -}} -{{- $_ := set $renamed "windows_adfs_token_requests" "windows_adfs_token_requests_total" -}} -{{- $_ := set $renamed "windows_adfs_windows_integrated_authentications" "windows_adfs_windows_integrated_authentications_total" -}} -{{- $_ := set $renamed "windows_net_packets_outbound_errors" "windows_net_packets_outbound_errors_total" -}} -{{- $_ := set $renamed "windows_net_packets_received_discarded" "windows_net_packets_received_discarded_total" -}} -{{- $_ := set $renamed "windows_net_packets_received_errors" "windows_net_packets_received_errors_total" -}} -{{- $_ := set $renamed "windows_net_packets_received_total" "windows_net_packets_received_total_total" -}} -{{- $_ := set $renamed "windows_net_packets_received_unknown" "windows_net_packets_received_unknown_total" -}} -{{- $_ := set $renamed "windows_dns_memory_used_bytes_total" "windows_dns_memory_used_bytes" -}} -{{- $renamed | toJson -}} -{{- end -}} - -{{- define "windowsExporter.renamedMetricsRelabeling" -}} -{{- range $original, $new := (include "windowsExporter.renamedMetrics" . | fromJson) -}} -- sourceLabels: [__name__] - regex: {{ $original }} - replacement: '{{ $new }}' - targetLabel: __name__ -{{ end -}} -{{- end -}} - -{{- define "windowsExporter.renamedMetricsRules" -}} -{{- range $original, $new := (include "windowsExporter.renamedMetrics" . | fromJson) -}} -- record: {{ $original }} - expr: {{ $new }} -{{ end -}} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/configmap.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/configmap.yaml deleted file mode 100644 index e7647a4077..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/configmap.yaml +++ /dev/null @@ -1,10 +0,0 @@ -{{- if .Values.clients }}{{ if .Values.clients.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "windowsExporter.name" . }}-scripts - namespace: {{ template "windowsExporter.namespace" . }} - labels: {{ include "windowsExporter.labels" . | nindent 4 }} -data: -{{ (.Files.Glob "scripts/*").AsConfig | indent 2 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/daemonset.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/daemonset.yaml deleted file mode 100644 index be6125ddfa..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/daemonset.yaml +++ /dev/null @@ -1,62 +0,0 @@ -{{- if .Values.clients }}{{ if .Values.clients.enabled }} -{{ include "windowsExporter.validatePathPrefix" . }} -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: {{ template "windowsExporter.name" . }} - namespace: {{ template "windowsExporter.namespace" . }} - labels: {{ include "windowsExporter.labels" . | nindent 4 }} -spec: - selector: - matchLabels: {{ include "windowsExporter.labels" . | nindent 6 }} - template: - metadata: - labels: {{ include "windowsExporter.labels" . | nindent 8 }} - spec: - hostNetwork: true - nodeSelector: {{ include "windowsExporter.client.nodeSelector" . | nindent 8 }} - tolerations: {{ include "windowsExporter.client.tolerations" . | nindent 8 }} - serviceAccountName: {{ template "windowsExporter.name" . }} - initContainers: - - name: ensure-port-9796-is-free - securityContext: {{ toYaml $.Values.securityContext | nindent 12 }} - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - - C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe - args: ["-f", "scripts/ensure-9796-is-free.ps1"] - volumeMounts: - - name: exporter-scripts - mountPath: /scripts - - name: configure-firewall-rule - securityContext: {{ toYaml $.Values.securityContext | nindent 12 }} - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - - C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe - args: ["-f", "scripts/configure-firewall.ps1"] - volumeMounts: - - name: exporter-scripts - mountPath: /scripts - containers: - - name: windows-exporter-node - securityContext: {{ toYaml $.Values.securityContext | nindent 12 }} - image: {{ template "system_default_registry" . }}{{ .Values.clients.image.repository }}:{{ .Values.clients.image.tag }} - command: - - "windows-exporter.exe" - args: ["--collectors.enabled={{.Values.clients.enabledCollectors}}", "--telemetry.addr=:{{.Values.clients.port}}", "--telemetry.max-requests={{.Values.clients.maxRequests}}", "--telemetry.path=/metrics"] - ports: - - name: http - containerPort: {{.Values.clients.port}} - hostPort: {{.Values.clients.port}} - protocol: TCP - -{{- if .Values.clients.args }} - args: {{ .Values.clients.args }} -{{- end }} -{{- if .Values.clients.resources }} - resources: {{ toYaml .Values.clients.resources | nindent 10 }} -{{end }} - volumes: - - name: exporter-scripts - configMap: - name: {{ template "windowsExporter.name" . }}-scripts -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/prometheusrule.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/prometheusrule.yaml deleted file mode 100644 index f31983122a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/prometheusrule.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if and .Values.prometheusRule .Values.clients }}{{- if and .Values.prometheusRule.enabled .Values.clients.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - labels: {{ include "windowsExporter.labels" . | nindent 4 }} - name: {{ template "windowsExporter.name" . }} - namespace: {{ template "windowsExporter.namespace" . }} -spec: - groups: - - name: windows-exporter-relabel.rules - rules: -{{- include "windowsExporter.renamedMetricsRules" . | nindent 4 -}} -{{- end }}{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/rbac.yaml deleted file mode 100644 index e3da3e1605..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/rbac.yaml +++ /dev/null @@ -1,81 +0,0 @@ -{{- if .Values.clients }}{{ if .Values.clients.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "windowsExporter.name" . }} - namespace: {{ template "windowsExporter.namespace" . }} - labels: {{ include "windowsExporter.labels" . | nindent 4 }} -rules: -- apiGroups: ['authentication.k8s.io'] - resources: ['tokenreviews'] - verbs: ['create'] -- apiGroups: ['authorization.k8s.io'] - resources: ['subjectaccessreviews'] - verbs: ['create'] -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: ['{{ template "windowsExporter.name" . }}'] -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "windowsExporter.name" . }} - namespace: {{ template "windowsExporter.namespace" . }} - labels: {{ include "windowsExporter.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "windowsExporter.name" . }} -subjects: -- kind: ServiceAccount - name: {{ template "windowsExporter.name" . }} - namespace: {{ .Release.Namespace }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "windowsExporter.name" . }} - namespace: {{ template "windowsExporter.namespace" . }} - labels: {{ include "windowsExporter.labels" . | nindent 4 }} -{{- if .Values.clients.imagePullSecrets }} -imagePullSecrets: {{ toYaml .Values.clients.imagePullSecrets | nindent 2 }} -{{- end }} ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "windowsExporter.name" . }} - namespace: {{ template "windowsExporter.namespace" . }} - labels: {{ include "windowsExporter.labels" . | nindent 4 }} -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 0 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' - - 'hostPath' - allowedHostPaths: - - pathPrefix: \\.\pipe\rancher_wins - - pathPrefix: \\.\pipe\rancher_wins_proxy - - pathPrefix: c:/etc/windows-exporter -{{- end }}{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/service.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/service.yaml deleted file mode 100644 index 03b87faaef..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{- if and .Values.clients }}{{- if and .Values.clients.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "windowsExporter.name" . }} - namespace: {{ template "windowsExporter.namespace" . }} - labels: {{ include "windowsExporter.labels" . | nindent 4 }} -spec: - ports: - - name: windows-metrics - port: {{ required "Need .Values.clients.port to figure out where to get metrics from" .Values.clients.port }} - protocol: TCP - targetPort: {{ .Values.clients.port }} - selector: {{ include "windowsExporter.labels" . | nindent 4 }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/servicemonitor.yaml deleted file mode 100644 index 26ece9b05a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/templates/servicemonitor.yaml +++ /dev/null @@ -1,41 +0,0 @@ -{{- if and .Values.serviceMonitor .Values.clients }}{{- if and .Values.serviceMonitor.enabled .Values.clients.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - labels: {{ include "windowsExporter.labels" . | nindent 4 }} - name: {{ template "windowsExporter.name" . }} - namespace: {{ template "windowsExporter.namespace" . }} -spec: - selector: - matchLabels: {{ include "windowsExporter.labels" . | nindent 6 }} - namespaceSelector: - matchNames: - - {{ template "windowsExporter.namespace" . }} - jobLabel: component - podTargetLabels: - - component - endpoints: - - port: windows-metrics - metricRelabelings: -{{- include "windowsExporter.renamedMetricsRelabeling" . | nindent 4 -}} - - sourceLabels: [__name__] - regex: 'wmi_(.*)' - replacement: 'windows_$1' - targetLabel: __name__ - - sourceLabels: [volume, nic] - regex: (.*);(.*) - separator: '' - targetLabel: device - action: replace - replacement: $1$2 - - sourceLabels: [__name__] - regex: windows_cs_logical_processors - replacement: 'system' - targetLabel: mode - relabelings: - - separator: ':' - sourceLabels: - - __meta_kubernetes_pod_host_ip - - __meta_kubernetes_pod_container_port_number - targetLabel: instance -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/values.yaml deleted file mode 100644 index b5fb3f2610..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/charts/windowsExporter/values.yaml +++ /dev/null @@ -1,57 +0,0 @@ -# Default values for rancher-windows-exporter. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Configuration - -global: - cattle: - psp: - enabled: false - systemDefaultRegistry: "" - rkeWindowsPathPrefix: "c:\\" - -# Configure ServiceMonitor that monitors metrics -serviceMonitor: - enabled: true - -# Configure PrometheusRule that renames existing metrics -prometheusRule: - enabled: true - -## Components scraping metrics from Windows nodes -## -clients: - enabled: true - - maxRequests: 5 - port: 9796 - image: - repository: rancher/windows_exporter-package - tag: v0.1.0 - os: "windows" - - # Specify the IP addresses of nodes that you want to collect metrics from - endpoints: [] - - # Get more details on https://github.com/prometheus-community/windows_exporter - args: [] - enabledCollectors: "net,os,service,system,cpu,cs,logical_disk,tcp,memory,container" - - # Resource limits - resources: {} - - # Options to select nodes to target for scraping Windows metrics - nodeSelector: {} # Note: {kubernetes.io/os: windows} is default and cannot be overridden - tolerations: [] # Note: if not specified, the default option is to use [{operator: Exists}] - - # Image Pull Secrets for the service account used by the clients - imagePullSecrets: {} - - proxy: - resources: {} - -securityContext: - windowsOptions: - hostProcess: true - runAsUserName: "NT AUTHORITY\\SYSTEM" diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/files/ingress-nginx/nginx.json b/charts/rancher-monitoring/103.1.2+up45.31.1/files/ingress-nginx/nginx.json deleted file mode 100644 index 565352235a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/files/ingress-nginx/nginx.json +++ /dev/null @@ -1,1445 +0,0 @@ -{ - "__inputs": [ - - ], - "__requires": [ - - ], - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "datasource": "$datasource", - "enable": true, - "expr": "sum(changes(nginx_ingress_controller_config_last_reload_successful_timestamp_seconds{instance!=\"unknown\",controller_class=~\"$controller_class\",namespace=~\"$namespace\"}[30s])) by (controller_class)", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "Config Reloads", - "showIn": 0, - "step": "30s", - "tagKeys": "controller_class", - "tags": [], - "titleFormat": "Config Reloaded", - "type": "tags" - } - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "iteration": 1534359654832, - "links": [], - "panels": [ - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "$datasource", - "format": "ops", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 6, - "x": 0, - "y": 0 - }, - "id": 20, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": true, - "lineColor": "rgb(31, 120, 193)", - "show": true - }, - "tableColumn": "", - "targets": [ - { - "expr": "round(sum(irate(nginx_ingress_controller_requests{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",namespace=~\"$namespace\"}[2m])), 0.001)", - "format": "time_series", - "intervalFactor": 1, - "refId": "A", - "step": 4 - } - ], - "thresholds": "", - "title": "Controller Request Volume", - "transparent": false, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "$datasource", - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 6, - "x": 6, - "y": 0 - }, - "id": 82, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": true, - "lineColor": "rgb(31, 120, 193)", - "show": true - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(avg_over_time(nginx_ingress_controller_nginx_process_connections{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",state=\"active\"}[2m]))", - "format": "time_series", - "instant": false, - "intervalFactor": 1, - "refId": "A", - "step": 4 - } - ], - "thresholds": "", - "title": "Controller Connections", - "transparent": false, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "$datasource", - "format": "percentunit", - "gauge": { - "maxValue": 100, - "minValue": 80, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": false - }, - "gridPos": { - "h": 3, - "w": 6, - "x": 12, - "y": 0 - }, - "id": 21, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": true, - "lineColor": "rgb(31, 120, 193)", - "show": true - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(rate(nginx_ingress_controller_requests{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",namespace=~\"$namespace\",status!~\"[4-5].*\"}[2m])) / sum(rate(nginx_ingress_controller_requests{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",namespace=~\"$namespace\"}[2m]))", - "format": "time_series", - "intervalFactor": 1, - "refId": "A", - "step": 4 - } - ], - "thresholds": "95, 99, 99.5", - "title": "Controller Success Rate (non-4|5xx responses)", - "transparent": false, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "$datasource", - "decimals": 0, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 3, - "x": 18, - "y": 0 - }, - "id": 81, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": true, - "lineColor": "rgb(31, 120, 193)", - "show": true - }, - "tableColumn": "", - "targets": [ - { - "expr": "avg(irate(nginx_ingress_controller_success{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\"}[1m])) * 60", - "format": "time_series", - "instant": false, - "intervalFactor": 1, - "refId": "A", - "step": 4 - } - ], - "thresholds": "", - "title": "Config Reloads", - "transparent": false, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "total" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "$datasource", - "decimals": 0, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 3, - "x": 21, - "y": 0 - }, - "id": 83, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": true, - "lineColor": "rgb(31, 120, 193)", - "show": true - }, - "tableColumn": "", - "targets": [ - { - "expr": "count(nginx_ingress_controller_config_last_reload_successful{controller_pod=~\"$controller\",controller_namespace=~\"$namespace\"} == 0)", - "format": "time_series", - "instant": true, - "intervalFactor": 1, - "refId": "A", - "step": 4 - } - ], - "thresholds": "", - "title": "Last Config Failed", - "transparent": false, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "decimals": 2, - "editable": true, - "error": false, - "fill": 1, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 3 - }, - "height": "200px", - "id": 86, - "isNew": true, - "legend": { - "alignAsTable": true, - "avg": true, - "current": false, - "hideEmpty": false, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": 300, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "repeatDirection": "h", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "round(sum(irate(nginx_ingress_controller_requests{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\"}[2m])) by (ingress), 0.001)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ ingress }}", - "metric": "network", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Ingress Request Volume", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "transparent": false, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "reqps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "max - istio-proxy": "#890f02", - "max - master": "#bf1b00", - "max - prometheus": "#bf1b00" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "decimals": 2, - "editable": false, - "error": false, - "fill": 0, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 3 - }, - "id": 87, - "isNew": true, - "legend": { - "alignAsTable": true, - "avg": true, - "current": false, - "hideEmpty": true, - "hideZero": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": 300, - "sort": "avg", - "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(nginx_ingress_controller_requests{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",namespace=~\"$namespace\",ingress=~\"$ingress\",status!~\"[4-5].*\"}[2m])) by (ingress) / sum(rate(nginx_ingress_controller_requests{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",namespace=~\"$namespace\",ingress=~\"$ingress\"}[2m])) by (ingress)", - "format": "time_series", - "instant": false, - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "{{ ingress }}", - "metric": "container_memory_usage:sort_desc", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Ingress Success Rate (non-4|5xx responses)", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 1, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "decimals": 2, - "editable": true, - "error": false, - "fill": 1, - "grid": {}, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 10 - }, - "height": "200px", - "id": 32, - "isNew": true, - "legend": { - "alignAsTable": false, - "avg": true, - "current": true, - "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": false, - "targets": [ - { - "expr": "sum (irate (nginx_ingress_controller_request_size_sum{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\"}[2m]))", - "format": "time_series", - "instant": false, - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "Received", - "metric": "network", - "refId": "A", - "step": 10 - }, - { - "expr": "- sum (irate (nginx_ingress_controller_response_size_sum{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\"}[2m]))", - "format": "time_series", - "hide": false, - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "Sent", - "metric": "network", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Network I/O pressure", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "cumulative" - }, - "transparent": false, - "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": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "max - istio-proxy": "#890f02", - "max - master": "#bf1b00", - "max - prometheus": "#bf1b00" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "decimals": 2, - "editable": false, - "error": false, - "fill": 0, - "grid": {}, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 10 - }, - "id": 77, - "isNew": true, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "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": false, - "targets": [ - { - "expr": "avg(nginx_ingress_controller_nginx_process_resident_memory_bytes{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\"}) ", - "format": "time_series", - "instant": false, - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "nginx", - "metric": "container_memory_usage:sort_desc", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Average Memory Usage", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "max - istio-proxy": "#890f02", - "max - master": "#bf1b00" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "decimals": 3, - "editable": false, - "error": false, - "fill": 0, - "grid": {}, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 10 - }, - "height": "", - "id": 79, - "isNew": true, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sort": null, - "sortDesc": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "avg (rate (nginx_ingress_controller_nginx_process_cpu_seconds_total{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\"}[2m])) ", - "format": "time_series", - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "nginx", - "metric": "container_cpu", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - { - "colorMode": "critical", - "fill": true, - "line": true, - "op": "gt" - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Average CPU Usage", - "tooltip": { - "msResolution": true, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "transparent": false, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": "cores", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "columns": [], - "datasource": "$datasource", - "fontSize": "100%", - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 16 - }, - "hideTimeOverride": false, - "id": 75, - "links": [], - "pageSize": 7, - "repeat": null, - "repeatDirection": "h", - "scroll": true, - "showHeader": true, - "sort": { - "col": 1, - "desc": true - }, - "styles": [ - { - "alias": "Ingress", - "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": "ingress", - "preserveFormat": false, - "sanitize": false, - "thresholds": [], - "type": "string", - "unit": "short" - }, - { - "alias": "Requests", - "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 #A", - "thresholds": [ - "" - ], - "type": "number", - "unit": "ops" - }, - { - "alias": "Errors", - "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": "ops" - }, - { - "alias": "P50 Latency", - "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": 0, - "link": false, - "pattern": "Value #C", - "thresholds": [], - "type": "number", - "unit": "dtdurations" - }, - { - "alias": "P90 Latency", - "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": 0, - "pattern": "Value #D", - "thresholds": [], - "type": "number", - "unit": "dtdurations" - }, - { - "alias": "P99 Latency", - "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": 0, - "pattern": "Value #E", - "thresholds": [], - "type": "number", - "unit": "dtdurations" - }, - { - "alias": "IN", - "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 #F", - "thresholds": [ - "" - ], - "type": "number", - "unit": "Bps" - }, - { - "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, - "pattern": "Time", - "thresholds": [], - "type": "hidden", - "unit": "short" - }, - { - "alias": "OUT", - "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 #G", - "thresholds": [], - "type": "number", - "unit": "Bps" - } - ], - "targets": [ - { - "expr": "histogram_quantile(0.50, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\"}[2m])) by (le, ingress))", - "format": "table", - "hide": false, - "instant": true, - "intervalFactor": 1, - "legendFormat": "{{ ingress }}", - "refId": "C" - }, - { - "expr": "histogram_quantile(0.90, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\"}[2m])) by (le, ingress))", - "format": "table", - "hide": false, - "instant": true, - "intervalFactor": 1, - "legendFormat": "{{ ingress }}", - "refId": "D" - }, - { - "expr": "histogram_quantile(0.99, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\"}[2m])) by (le, ingress))", - "format": "table", - "hide": false, - "instant": true, - "intervalFactor": 1, - "legendFormat": "{{ destination_service }}", - "refId": "E" - }, - { - "expr": "sum(irate(nginx_ingress_controller_request_size_sum{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\"}[2m])) by (ingress)", - "format": "table", - "hide": false, - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ ingress }}", - "refId": "F" - }, - { - "expr": "sum(irate(nginx_ingress_controller_response_size_sum{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\"}[2m])) by (ingress)", - "format": "table", - "instant": true, - "intervalFactor": 1, - "legendFormat": "{{ ingress }}", - "refId": "G" - } - ], - "timeFrom": null, - "title": "Ingress Percentile Response Times and Transfer Rates", - "transform": "table", - "transparent": false, - "type": "table" - }, - { - "columns": [ - { - "text": "Current", - "value": "current" - } - ], - "datasource": "$datasource", - "fontSize": "100%", - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 24 - }, - "height": "1024", - "id": 85, - "links": [], - "pageSize": 7, - "scroll": true, - "showHeader": true, - "sort": { - "col": 1, - "desc": false - }, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "date" - }, - { - "alias": "TTL", - "colorMode": "cell", - "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": 0, - "pattern": "Current", - "thresholds": [ - "0", - "691200" - ], - "type": "number", - "unit": "s" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "decimals": 2, - "pattern": "/.*/", - "thresholds": [], - "type": "number", - "unit": "short" - } - ], - "targets": [ - { - "expr": "avg(nginx_ingress_controller_ssl_expire_time_seconds{kubernetes_pod_name=~\"$controller\",namespace=~\"$namespace\",ingress=~\"$ingress\"}) by (host) - time()", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{ host }}", - "metric": "gke_letsencrypt_cert_expiration", - "refId": "A", - "step": 1 - } - ], - "title": "Ingress Certificate Expiry", - "transform": "timeseries_aggregations", - "type": "table" - } - ], - "refresh": "5s", - "schemaVersion": 16, - "style": "dark", - "tags": [ - "nginx" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": ".*", - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": true, - "label": "Namespace", - "multi": false, - "name": "namespace", - "options": [], - "query": "label_values(nginx_ingress_controller_config_hash, controller_namespace)", - "refresh": 1, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": true, - "label": "Controller Class", - "multi": false, - "name": "controller_class", - "options": [], - "query": "label_values(nginx_ingress_controller_config_hash{namespace=~\"$namespace\"}, controller_class) ", - "refresh": 1, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": true, - "label": "Controller", - "multi": false, - "name": "controller", - "options": [], - "query": "label_values(nginx_ingress_controller_config_hash{namespace=~\"$namespace\",controller_class=~\"$controller_class\"}, controller_pod) ", - "refresh": 1, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "current": { - "tags": [], - "text": "All", - "value": "$__all" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": true, - "label": "Ingress", - "multi": false, - "name": "ingress", - "options": [], - "query": "label_values(nginx_ingress_controller_requests{namespace=~\"$namespace\",controller_class=~\"$controller_class\",controller_pod=~\"$controller\"}, ingress) ", - "refresh": 1, - "regex": "", - "sort": 2, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "2m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "NGINX / Ingress Controller", - "uid": "nginx", - "version": 1 -} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/files/ingress-nginx/request-handling-performance.json b/charts/rancher-monitoring/103.1.2+up45.31.1/files/ingress-nginx/request-handling-performance.json deleted file mode 100644 index 156e33123d..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/files/ingress-nginx/request-handling-performance.json +++ /dev/null @@ -1,963 +0,0 @@ -{ - "__inputs": [ - - ], - "__requires": [ - - ], - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "description": "", - "editable": true, - "gnetId": 9614, - "graphTooltip": 1, - "id": null, - "iteration": 1582146566338, - "links": [], - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "description": "Total time taken for nginx and upstream servers to process a request and send a response", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "hiddenSeries": false, - "id": 91, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(\n 0.5,\n sum by (le)(\n rate(\n nginx_ingress_controller_request_duration_seconds_bucket{\n ingress =~ \"$ingress\"\n }[1m]\n )\n )\n)", - "interval": "", - "legendFormat": ".5", - "refId": "D" - }, - { - "expr": "histogram_quantile(\n 0.95,\n sum by (le)(\n rate(\n nginx_ingress_controller_request_duration_seconds_bucket{\n ingress =~ \"$ingress\"\n }[1m]\n )\n )\n)", - "interval": "", - "legendFormat": ".95", - "refId": "B" - }, - { - "expr": "histogram_quantile(\n 0.99,\n sum by (le)(\n rate(\n nginx_ingress_controller_request_duration_seconds_bucket{\n ingress =~ \"$ingress\"\n }[1m]\n )\n )\n)", - "interval": "", - "legendFormat": ".99", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Total request handling time", - "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", - "description": "The time spent on receiving the response from the upstream server", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "hiddenSeries": false, - "id": 94, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(\n 0.5,\n sum by (le)(\n rate(\n nginx_ingress_controller_response_duration_seconds_bucket{\n ingress =~ \"$ingress\"\n }[1m]\n )\n )\n)", - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": ".5", - "refId": "D" - }, - { - "expr": "histogram_quantile(\n 0.95,\n sum by (le)(\n rate(\n nginx_ingress_controller_response_duration_seconds_bucket{\n ingress =~ \"$ingress\"\n }[1m]\n )\n )\n)", - "interval": "", - "legendFormat": ".95", - "refId": "B" - }, - { - "expr": "histogram_quantile(\n 0.99,\n sum by (le)(\n rate(\n nginx_ingress_controller_response_duration_seconds_bucket{\n ingress =~ \"$ingress\"\n }[1m]\n )\n )\n)", - "interval": "", - "legendFormat": ".99", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Upstream response time", - "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", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "hiddenSeries": false, - "id": 93, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": " sum by (path)(\n rate(\n nginx_ingress_controller_request_duration_seconds_count{\n ingress =~ \"$ingress\"\n }[1m]\n )\n )\n", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ path }}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Request volume by Path", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "reqps", - "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", - "description": "For each path observed, its median upstream response time", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "hiddenSeries": false, - "id": 98, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(\n .5,\n sum by (le, path)(\n rate(\n nginx_ingress_controller_response_duration_seconds_bucket{\n ingress =~ \"$ingress\"\n }[1m]\n )\n )\n)", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ path }}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Median upstream response time by Path", - "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", - "description": "Percentage of 4xx and 5xx responses among all responses.", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "hiddenSeries": false, - "id": 100, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null as zero", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum by (path) (rate(nginx_ingress_controller_request_duration_seconds_count{\n ingress =~ \"$ingress\",\n status =~ \"[4-5].*\"\n}[1m])) / sum by (path) (rate(nginx_ingress_controller_request_duration_seconds_count{\n ingress =~ \"$ingress\",\n}[1m]))", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ path }}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Response error rate by Path", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "description": "For each path observed, the sum of upstream request time", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "hiddenSeries": false, - "id": 102, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum by (path) (rate(nginx_ingress_controller_response_duration_seconds_sum{ingress =~ \"$ingress\"}[1m]))", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ path }}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Upstream time consumed by Path", - "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", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "hiddenSeries": false, - "id": 101, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": " sum (\n rate(\n nginx_ingress_controller_request_duration_seconds_count{\n ingress =~ \"$ingress\",\n status =~\"[4-5].*\",\n }[1m]\n )\n ) by(path, status)\n", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ path }} {{ status }}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Response error volume by Path", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "reqps", - "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", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "hiddenSeries": false, - "id": 99, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum (\n rate (\n nginx_ingress_controller_response_size_sum {\n ingress =~ \"$ingress\",\n }[1m]\n )\n) by (path) / sum (\n rate(\n nginx_ingress_controller_response_size_count {\n ingress =~ \"$ingress\",\n }[1m]\n )\n) by (path)\n", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ path }}", - "refId": "D" - }, - { - "expr": " sum (rate(nginx_ingress_controller_response_size_bucket{\n ingress =~ \"$ingress\",\n }[1m])) by (le)\n", - "hide": true, - "legendFormat": "{{le}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Average response size by Path", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "hiddenSeries": false, - "id": 96, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum (\n rate(\n nginx_ingress_controller_ingress_upstream_latency_seconds_sum {\n ingress =~ \"$ingress\",\n }[1m]\n)) / sum (\n rate(\n nginx_ingress_controller_ingress_upstream_latency_seconds_count {\n ingress =~ \"$ingress\",\n }[1m]\n )\n)\n", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "average", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Upstream service latency", - "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 - } - } - ], - "refresh": "30s", - "schemaVersion": 22, - "style": "dark", - "tags": [ - "nginx" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": ".*", - "current": {}, - "datasource": "$datasource", - "definition": "label_values(nginx_ingress_controller_requests, ingress) ", - "hide": 0, - "includeAll": true, - "label": "Service Ingress", - "multi": false, - "name": "ingress", - "options": [], - "query": "label_values(nginx_ingress_controller_requests, ingress) ", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 2, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-15m", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "2m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "NGINX / Request Handling Performance", - "uid": "4GFbkOsZk", - "version": 1 -} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/cluster/rancher-cluster-nodes.json b/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/cluster/rancher-cluster-nodes.json deleted file mode 100644 index 1d4943501b..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/cluster/rancher-cluster-nodes.json +++ /dev/null @@ -1,793 +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": 28, - "links": [], - "panels": [ - { - "aliasColors": { - "{{instance}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 0 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "1 - avg(irate({__name__=~\"node_cpu_seconds_total|windows_cpu_time_total\",mode=\"idle\"}[$__rate_interval])) by (instance)", - "interval": "", - "legendFormat": "{{instance}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "CPU Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "percentunit", - "label": null, - "logBase": 1, - "max": "1", - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "{{instance}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Load[5m] ({{instance}})" - }, - "properties": [] - } - ] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 0 - }, - "hiddenSeries": false, - "id": 3, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(node_load5 OR avg_over_time(windows_system_processor_queue_length[5m])) by (instance)", - "interval": "", - "legendFormat": "Load[5m] ({{instance}})", - "refId": "A" - }, - { - "expr": "sum(node_load1 OR avg_over_time(windows_system_processor_queue_length[1m])) by (instance)", - "interval": "", - "legendFormat": "Load[1m] ({{instance}})", - "refId": "B" - }, - { - "expr": "sum(node_load15 OR avg_over_time(windows_system_processor_queue_length[15m])) by (instance)", - "interval": "", - "legendFormat": "Load[15m] ({{instance}})", - "refId": "C" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Load Average", - "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": { - "{{instance}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 0 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "1 - sum(node_memory_MemAvailable_bytes OR windows_os_physical_memory_free_bytes) by (instance) / sum(node_memory_MemTotal_bytes OR windows_cs_physical_memory_bytes) by (instance) ", - "interval": "", - "legendFormat": "{{instance}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Memory Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "percentunit", - "label": null, - "logBase": 1, - "max": "1", - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "{{instance}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 7 - }, - "hiddenSeries": false, - "id": 5, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "1 - (sum(node_filesystem_free_bytes{device!~\"rootfs|HarddiskVolume.+\"} OR windows_logical_disk_free_bytes{volume!~\"(HarddiskVolume.+|[A-Z]:.+)\"}) by (instance) / sum(node_filesystem_size_bytes{device!~\"rootfs|HarddiskVolume.+\"} OR windows_logical_disk_size_bytes{volume!~\"(HarddiskVolume.+|[A-Z]:.+)\"}) by (instance))", - "interval": "", - "legendFormat": "{{instance}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Disk Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "percentunit", - "label": null, - "logBase": 1, - "max": "1", - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "{{instance}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 7 - }, - "hiddenSeries": false, - "id": 6, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(node_disk_read_bytes_total[$__rate_interval]) OR rate(windows_logical_disk_read_bytes_total[$__rate_interval])) by (instance)", - "interval": "", - "legendFormat": "Read ({{instance}})", - "refId": "A" - }, - { - "expr": "sum(rate(node_disk_written_bytes_total[$__rate_interval]) OR rate(windows_logical_disk_write_bytes_total[$__rate_interval])) by (instance)", - "interval": "", - "legendFormat": "Write ({{instance}})", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Disk I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "Bps", - "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": { - "{{instance}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 7 - }, - "hiddenSeries": false, - "id": 7, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(node_network_receive_errs_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\"}[$__rate_interval])) by (instance) OR sum(rate(windows_net_packets_received_errors_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*'}[$__rate_interval])) by (instance)", - "interval": "", - "legendFormat": "Receive Errors ({{instance}})", - "refId": "A" - }, - { - "expr": "sum(rate(node_network_receive_packets_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\"}[$__rate_interval])) by (instance) OR sum(rate(windows_net_packets_received_total_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*'}[$__rate_interval])) by (instance)", - "interval": "", - "legendFormat": "Receive Total ({{instance}})", - "refId": "B" - }, - { - "expr": "sum(rate(node_network_transmit_errs_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\"}[$__rate_interval])) by (instance) OR sum(rate(windows_net_packets_outbound_errors_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*'}[$__rate_interval])) by (instance)", - "interval": "", - "legendFormat": "Transmit Errors ({{instance}})", - "refId": "C" - }, - { - "expr": "sum(rate(node_network_receive_drop_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\"}[$__rate_interval])) by (instance) OR sum(rate(windows_net_packets_received_discarded_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*'}[$__rate_interval])) by (instance)", - "interval": "", - "legendFormat": "Receive Dropped ({{instance}})", - "refId": "D" - }, - { - "expr": "sum(rate(node_network_transmit_drop_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\"}[$__rate_interval])) by (instance) OR sum(rate(windows_net_packets_outbound_discarded{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*'}[$__rate_interval])) by (instance)", - "interval": "", - "legendFormat": "Transmit Dropped ({{instance}})", - "refId": "E" - }, - { - "expr": "sum(rate(node_network_transmit_packets_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\"}[$__rate_interval])) by (instance) OR sum(rate(windows_net_packets_sent_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*'}[$__rate_interval])) by (instance)", - "interval": "", - "legendFormat": "Transmit Total ({{instance}})", - "refId": "F" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network Traffic", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "pps", - "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": { - "{{instance}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 14 - }, - "hiddenSeries": false, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(node_network_transmit_bytes_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\"}[$__rate_interval]) OR rate(windows_net_packets_sent_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*'}[$__rate_interval])) by (instance)", - "interval": "", - "legendFormat": "Transmit Total ({{instance}})", - "refId": "A" - }, - { - "expr": "sum(rate(node_network_receive_bytes_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\"}[$__rate_interval]) OR rate(windows_net_packets_received_total_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*'}[$__rate_interval])) by (instance)", - "interval": "", - "legendFormat": "Receive Total ({{instance}})", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "schemaVersion": 26, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "", - "title": "Rancher / Cluster (Nodes)", - "uid": "rancher-cluster-nodes-1", - "version": 3 -} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/cluster/rancher-cluster.json b/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/cluster/rancher-cluster.json deleted file mode 100644 index 24385a237a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/cluster/rancher-cluster.json +++ /dev/null @@ -1,776 +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": 28, - "links": [], - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 0 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "1 - avg(irate({__name__=~\"node_cpu_seconds_total|windows_cpu_time_total\",mode=\"idle\"}[$__rate_interval]))", - "legendFormat": "Total", - "interval": "", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "CPU Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "percentunit", - "label": null, - "logBase": 1, - "max": "1", - "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", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Load[5m]" - }, - "properties": [] - } - ] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 0 - }, - "hiddenSeries": false, - "id": 3, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(node_load5 OR avg_over_time(windows_system_processor_queue_length[5m]))", - "interval": "", - "legendFormat": "Load[5m]", - "refId": "A" - }, - { - "expr": "sum(node_load1 OR avg_over_time(windows_system_processor_queue_length[1m]))", - "interval": "", - "legendFormat": "Load[1m]", - "refId": "B" - }, - { - "expr": "sum(node_load15 OR avg_over_time(windows_system_processor_queue_length[15m]))", - "interval": "", - "legendFormat": "Load[15m]", - "refId": "C" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Load Average", - "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": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 0 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "1 - sum(node_memory_MemAvailable_bytes OR windows_os_physical_memory_free_bytes) / sum(node_memory_MemTotal_bytes OR windows_cs_physical_memory_bytes)", - "legendFormat": "Total", - "interval": "", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Memory Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "percentunit", - "label": null, - "logBase": 1, - "max": "1", - "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", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 7 - }, - "hiddenSeries": false, - "id": 5, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "1 - (sum(node_filesystem_free_bytes{device!~\"rootfs|HarddiskVolume.+\"} OR windows_logical_disk_free_bytes{volume!~\"(HarddiskVolume.+|[A-Z]:.+)\"}) / sum(node_filesystem_size_bytes{device!~\"rootfs|HarddiskVolume.+\"} OR windows_logical_disk_size_bytes{volume!~\"(HarddiskVolume.+|[A-Z]:.+)\"}))", - "legendFormat": "Total", - "interval": "", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Disk Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "percentunit", - "label": null, - "logBase": 1, - "max": "1", - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 7 - }, - "hiddenSeries": false, - "id": 6, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(node_disk_read_bytes_total[$__rate_interval]) OR rate(windows_logical_disk_read_bytes_total[$__rate_interval]))", - "interval": "", - "legendFormat": "Read", - "refId": "A" - }, - { - "expr": "sum(rate(node_disk_written_bytes_total[$__rate_interval]) OR rate(windows_logical_disk_write_bytes_total[$__rate_interval]))", - "interval": "", - "legendFormat": "Write", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Disk I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "Bps", - "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 - } - }, - { - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 7 - }, - "hiddenSeries": false, - "id": 7, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(rate(node_network_receive_errs_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\"}[$__rate_interval])) OR on() vector(0)) + (sum(rate(windows_net_packets_received_errors_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*'}[$__rate_interval])) OR on() vector(0))", - "interval": "", - "legendFormat": "Receive Errors", - "refId": "A" - }, - { - "expr": "(sum(rate(node_network_receive_packets_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\"}[$__rate_interval])) OR on() vector(0)) + (sum(rate(windows_net_packets_received_total_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*'}[$__rate_interval])) OR on() vector(0))", - "interval": "", - "legendFormat": "Receive Total", - "refId": "B" - }, - { - "expr": "(sum(rate(node_network_transmit_errs_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\"}[$__rate_interval])) OR on() vector(0)) + (sum(rate(windows_net_packets_outbound_errors_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*'}[$__rate_interval])) OR on() vector(0))", - "interval": "", - "legendFormat": "Transmit Errors", - "refId": "C" - }, - { - "expr": "(sum(rate(node_network_receive_drop_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\"}[$__rate_interval])) OR on() vector(0)) + (sum(rate(windows_net_packets_received_discarded_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*'}[$__rate_interval])) OR on() vector(0))", - "interval": "", - "legendFormat": "Receive Dropped", - "refId": "D" - }, - { - "expr": "(sum(rate(node_network_transmit_drop_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\"}[$__rate_interval])) OR on() vector(0)) + (sum(rate(windows_net_packets_outbound_discarded{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*'}[$__rate_interval])) OR on() vector(0))", - "interval": "", - "legendFormat": "Transmit Dropped", - "refId": "E" - }, - { - "expr": "(sum(rate(node_network_transmit_packets_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\"}[$__rate_interval])) OR on() vector(0)) + (sum(rate(windows_net_packets_sent_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*'}[$__rate_interval])) OR on() vector(0))", - "interval": "", - "legendFormat": "Transmit Total", - "refId": "F" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network Traffic", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "pps", - "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 - } - }, - { - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 14 - }, - "hiddenSeries": false, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(node_network_transmit_bytes_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\"}[$__rate_interval]) OR rate(windows_net_packets_sent_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*'}[$__rate_interval]))", - "interval": "", - "legendFormat": "Transmit Total", - "refId": "A" - }, - { - "expr": "sum(rate(node_network_receive_bytes_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\"}[$__rate_interval]) OR rate(windows_net_packets_received_total_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*'}[$__rate_interval]))", - "interval": "", - "legendFormat": "Receive Total", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "schemaVersion": 26, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "", - "title": "Rancher / Cluster", - "uid": "rancher-cluster-1", - "version": 3 -} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/home/rancher-default-home.json b/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/home/rancher-default-home.json deleted file mode 100644 index 3fce207561..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/home/rancher-default-home.json +++ /dev/null @@ -1,1290 +0,0 @@ -{ - "annotations": { - "list": [] - }, - "editable": false, - "gnetId": null, - "graphTooltip": 0, - "id": null, - "links": [], - "panels": [ - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 1, - "title": "", - "type": "welcome" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "Prometheus", - "decimals": 2, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 8, - "x": 0, - "y": 4 - }, - "height": "180px", - "id": 6, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "(1 - (avg(irate({__name__=~\"node_cpu_seconds_total|windows_cpu_time_total\",mode=\"idle\"}[5m])))) * 100", - "format": "time_series", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 10 - } - ], - "thresholds": "65, 90", - "title": "CPU Utilization", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "Prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 8, - "x": 8, - "y": 4 - }, - "height": "180px", - "id": 4, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "(1 - sum({__name__=~\"node_memory_MemAvailable_bytes|windows_os_physical_memory_free_bytes\"}) / sum({__name__=~\"node_memory_MemTotal_bytes|windows_cs_physical_memory_bytes\"})) * 100", - "format": "time_series", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 10 - } - ], - "thresholds": "65, 90", - "title": "Memory Utilization", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "Prometheus", - "decimals": 2, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 8, - "x": 16, - "y": 4 - }, - "height": "180px", - "id": 7, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "(1 - (((sum(node_filesystem_free_bytes{device!~\"rootfs|HarddiskVolume.+\"}) OR on() vector(0)) + (sum(windows_logical_disk_free_bytes{volume!~\"(HarddiskVolume.+|[A-Z]:.+)\"}) OR on() vector(0))) / ((sum(node_filesystem_size_bytes{device!~\"rootfs|HarddiskVolume.+\"}) OR on() vector(0)) + (sum(windows_logical_disk_size_bytes{volume!~\"(HarddiskVolume.+|[A-Z]:.+)\"}) OR on() vector(0))))) * 100", - "format": "time_series", - "interval": "10s", - "intervalFactor": 1, - "metric": "", - "refId": "A", - "step": 10 - } - ], - "thresholds": "65, 90", - "title": "Disk Utilization", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "Prometheus", - "decimals": 2, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 0, - "y": 9 - }, - "height": "1px", - "id": 11, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": " cores", - "postfixFontSize": "30%", - "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({__name__=~\"node_cpu_seconds_total|windows_cpu_time_total\",mode!=\"idle\"}[5m]))", - "format": "time_series", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 10 - } - ], - "thresholds": "", - "title": "CPU Used", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "Prometheus", - "decimals": 2, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 4, - "y": 9 - }, - "height": "1px", - "id": 12, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": " cores", - "postfixFontSize": "30%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(kube_node_status_allocatable_cpu_cores{}) OR sum(kube_node_status_allocatable{resource=\"cpu\",unit=\"core\"})", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 10 - } - ], - "thresholds": "", - "title": "CPU Total", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "Prometheus", - "decimals": 2, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 8, - "y": 9 - }, - "height": "1px", - "id": 9, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "20%", - "prefix": "", - "prefixFontSize": "20%", - "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({__name__=~\"node_memory_MemTotal_bytes|windows_cs_physical_memory_bytes\"}) - sum({__name__=~\"node_memory_MemAvailable_bytes|windows_os_physical_memory_free_bytes\"})", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 10 - } - ], - "thresholds": "", - "title": "Memory Used", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "Prometheus", - "decimals": 2, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 12, - "y": 9 - }, - "height": "1px", - "id": 10, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(kube_node_status_allocatable_memory_bytes{}) OR sum(kube_node_status_allocatable{resource=\"memory\", unit=\"byte\"})", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 10 - } - ], - "thresholds": "", - "title": "Memory Total", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "Prometheus", - "decimals": 2, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 16, - "y": 9 - }, - "height": "1px", - "id": 13, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "(sum(node_filesystem_size_bytes{device!~\"rootfs|HarddiskVolume.+\"}) - sum(node_filesystem_free_bytes{device!~\"rootfs|HarddiskVolume.+\"}) OR on() vector(0)) + (sum(windows_logical_disk_size_bytes{volume!~\"(HarddiskVolume.+|[A-Z]:.+)\"}) - sum(windows_logical_disk_free_bytes{volume!~\"(HarddiskVolume.+|[A-Z]:.+)\"}) OR on() vector(0))", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 10 - } - ], - "thresholds": "", - "title": "Disk Used", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "Prometheus", - "decimals": 2, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 20, - "y": 9 - }, - "height": "1px", - "id": 14, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "(sum(node_filesystem_size_bytes{device!~\"rootfs|HarddiskVolume.+\"}) OR on() vector(0)) + (sum(windows_logical_disk_size_bytes{volume!~\"(HarddiskVolume.+|[A-Z]:.+)\"}) OR on() vector(0))", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 10 - } - ], - "thresholds": "", - "title": "Disk Total", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "Prometheus", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 12 - }, - "hiddenSeries": false, - "id": 2051, - "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.5", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "1 - (avg(irate({__name__=~\"node_cpu_seconds_total|windows_cpu_time_total\",mode=\"idle\"}[$__rate_interval])))", - "format": "time_series", - "hide": false, - "instant": false, - "intervalFactor": 1, - "legendFormat": "Cluster", - "refId": "A" - }, - { - "expr": "1 - avg(irate({__name__=~\"node_cpu_seconds_total|windows_cpu_time_total\", mode=\"idle\"}[$__rate_interval])) by (instance)", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "{{ instance }}", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "CPU Usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "percentunit", - "label": "", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": "", - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "Prometheus", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 12 - }, - "hiddenSeries": false, - "id": 2052, - "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.5", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "100 * (1 - sum({__name__=~\"node_memory_MemAvailable_bytes|windows_os_physical_memory_free_bytes\"}) / sum({__name__=~\"node_memory_MemTotal_bytes|windows_cs_physical_memory_bytes\"}))", - "format": "time_series", - "hide": false, - "instant": false, - "intervalFactor": 1, - "legendFormat": "Cluster", - "refId": "A" - }, - { - "expr": "100 * (1- sum({__name__=~\"node_memory_MemAvailable_bytes|windows_os_physical_memory_free_bytes\"}) by (instance) / sum({__name__=~\"node_memory_MemTotal_bytes|windows_cs_physical_memory_bytes\"}) by (instance))", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "{{ instance }}", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Memory Usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "percent", - "label": "", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": "", - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "Prometheus", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 12 - }, - "hiddenSeries": false, - "id": 2053, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "(1 - ((sum(node_filesystem_free_bytes{device!~\"rootfs|HarddiskVolume.+\"}) OR on() vector(0)) + (sum(windows_logical_disk_free_bytes{volume!~\"(HarddiskVolume.+|[A-Z]:.+)\"} OR on() vector(0)))) / ((sum(node_filesystem_size_bytes{device!~\"rootfs|HarddiskVolume.+\"}) OR on() vector(0)) + (sum(windows_logical_disk_size_bytes{volume!~\"(HarddiskVolume.+|[A-Z]:.+)\"}) OR on() vector(0)))) * 100", - "legendFormat": "Cluster", - "refId": "A" - }, - { - "expr": "(1 - (sum(node_filesystem_free_bytes{device!~\"rootfs|HarddiskVolume.+\"}) by (instance)) / sum(node_filesystem_size_bytes{device!~\"rootfs|HarddiskVolume.+\"}) by (instance)) * 100", - "hide": false, - "legendFormat": "{{ instance }}", - "refId": "B" - }, - { - "expr": "(1 - (sum(windows_logical_disk_free_bytes{volume!~\"(HarddiskVolume.+|[A-Z]:.+)\"}) by (instance)) / sum(windows_logical_disk_size_bytes{volume!~\"(HarddiskVolume.+|[A-Z]:.+)\"}) by (instance)) * 100", - "hide": false, - "legendFormat": "{{ instance }}", - "refId": "C" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Disk Usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "percent", - "label": "", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": "", - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "folderId": 0, - "gridPos": { - "h": 15, - "w": 12, - "x": 0, - "y": 18 - }, - "headings": true, - "id": 3, - "limit": 30, - "links": [], - "query": "", - "recent": true, - "search": true, - "starred": false, - "tags": [], - "title": "Dashboards", - "type": "dashlist" - }, - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 18 - }, - "id": 2055, - "options": { - "content": "## About Rancher Monitoring\n\nRancher Monitoring is a Helm chart developed by Rancher that is powered by [Prometheus Operator](https://github.com/prometheus-operator/prometheus-operator). It is based on the upstream [kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) Helm chart maintained by the Prometheus community.\n\nBy default, the chart deploys Grafana alongside a set of Grafana dashboards curated by the [kube-prometheus](https://github.com/prometheus-operator/kube-prometheus) project.\n\nFor more information on how Rancher Monitoring differs from [kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack), please view the CHANGELOG.md of the rancher-monitoring chart located in the [rancher/charts](https://github.com/rancher/charts) repository.\n\nFor more information about how to configure Rancher Monitoring, please view the [Rancher docs](https://rancher.com/docs/rancher/v2.x/en/).\n\n", - "mode": "markdown" - }, - "pluginVersion": "7.1.0", - "timeFrom": null, - "timeShift": null, - "title": "", - "type": "text" - } - ], - "schemaVersion": 26, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "hidden": true, - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ], - "type": "timepicker" - }, - "timezone": "browser", - "title": "Home", - "uid": "rancher-home-1", - "version": 5 -} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/k8s/rancher-etcd-nodes.json b/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/k8s/rancher-etcd-nodes.json deleted file mode 100644 index 8af4b81ce0..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/k8s/rancher-etcd-nodes.json +++ /dev/null @@ -1,687 +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": 32, - "links": [], - "panels": [ - { - "aliasColors": { - "{{instance}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "Prometheus", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 0 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(etcd_network_client_grpc_received_bytes_total{job=\"kube-etcd\"}[$__rate_interval])) by (instance)", - "interval": "", - "legendFormat": "Client Traffic In ({{instance}})", - "refId": "A" - }, - { - "expr": "sum(rate(etcd_network_client_grpc_sent_bytes_total{job=\"kube-etcd\"}[$__rate_interval])) by (instance)", - "interval": "", - "legendFormat": "Client Traffic Out ({{instance}})", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "GRPC Client Traffic", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "Bps", - "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": { - "{{instance}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Load[5m]({{instance}})" - }, - "properties": [] - } - ] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 0 - }, - "hiddenSeries": false, - "id": 3, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(etcd_mvcc_db_total_size_in_bytes) by (instance)", - "interval": "", - "legendFormat": "DB Size ({{instance}})", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "DB 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 - } - }, - { - "aliasColors": { - "{{instance}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 0 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(grpc_server_started_total{grpc_service=\"etcdserverpb.Watch\",grpc_type=\"bidi_stream\"}) by (instance) - sum(grpc_server_handled_total{grpc_service=\"etcdserverpb.Watch\",grpc_type=\"bidi_stream\"}) by (instance)", - "interval": "", - "legendFormat": "Watch Streams ({{instance}})", - "refId": "A" - }, - { - "expr": "sum(grpc_server_started_total{grpc_service=\"etcdserverpb.Lease\",grpc_type=\"bidi_stream\"}) by (instance) - sum(grpc_server_handled_total{grpc_service=\"etcdserverpb.Lease\",grpc_type=\"bidi_stream\"}) by (instance)", - "interval": "", - "legendFormat": "Lease Watch Stream ({{instance}})", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Active Streams", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "{{instance}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 7 - }, - "hiddenSeries": false, - "id": 5, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(etcd_server_proposals_committed_total[$__rate_interval])) by (instance)", - "interval": "", - "legendFormat": "Proposal Committed ({{instance}})", - "refId": "A" - }, - { - "expr": "sum(rate(etcd_server_proposals_applied_total[$__rate_interval])) by (instance)", - "interval": "", - "legendFormat": "Proposal Applied ({{instance}})", - "refId": "B" - }, - { - "expr": "sum(rate(etcd_server_proposals_failed_total[$__rate_interval])) by (instance)", - "interval": "", - "legendFormat": "Proposal Failed ({{instance}})", - "refId": "C" - }, - { - "expr": "sum(etcd_server_proposals_pending) by (instance)", - "interval": "", - "legendFormat": "Proposal Pending ({{instance}})", - "refId": "D" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Raft Proposals", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "{{instance}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 7 - }, - "hiddenSeries": false, - "id": 6, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(grpc_server_started_total{grpc_type=\"unary\"}[$__rate_interval])) by (instance)", - "interval": "", - "legendFormat": "RPC Rate ({{instance}})", - "refId": "A" - }, - { - "expr": "sum(rate(grpc_server_handled_total{grpc_type=\"unary\",grpc_code!=\"OK\"}[$__rate_interval])) by (instance)", - "interval": "", - "legendFormat": "RPC Failure Rate ({{instance}})", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "RPC Rate", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 0, - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "decimals": null, - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "{{instance}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 7 - }, - "hiddenSeries": false, - "id": 7, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(etcd_disk_wal_fsync_duration_seconds_bucket[$__rate_interval])) by (instance, le))", - "interval": "", - "legendFormat": "WAL fsync ({{instance}})", - "refId": "A" - }, - { - "expr": "histogram_quantile(0.99, sum(rate(etcd_disk_backend_commit_duration_seconds_bucket[$__rate_interval])) by (instance, le))", - "interval": "", - "legendFormat": "DB fsync ({{instance}})", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Disk Sync Duration", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 2, - "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 - } - } - ], - "schemaVersion": 26, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "", - "title": "Rancher / etcd (Nodes)", - "uid": "rancher-etcd-nodes-1", - "version": 5 -} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/k8s/rancher-etcd.json b/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/k8s/rancher-etcd.json deleted file mode 100644 index 0c058cafb9..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/k8s/rancher-etcd.json +++ /dev/null @@ -1,669 +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": 33, - "links": [], - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "Prometheus", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 0 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(etcd_network_client_grpc_received_bytes_total{job=\"kube-etcd\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Client Traffic In", - "refId": "A" - }, - { - "expr": "sum(rate(etcd_network_client_grpc_sent_bytes_total{job=\"kube-etcd\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Client Traffic Out", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "GRPC Client Traffic", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "Bps", - "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", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [ - { - "properties": [] - } - ] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 0 - }, - "hiddenSeries": false, - "id": 3, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(etcd_mvcc_db_total_size_in_bytes)", - "interval": "", - "legendFormat": "DB Size", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "DB 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 - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 0 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(grpc_server_started_total{grpc_service=\"etcdserverpb.Watch\",grpc_type=\"bidi_stream\"}) - sum(grpc_server_handled_total{grpc_service=\"etcdserverpb.Watch\",grpc_type=\"bidi_stream\"})", - "interval": "", - "legendFormat": "Watch Streams", - "refId": "A" - }, - { - "expr": "sum(grpc_server_started_total{grpc_service=\"etcdserverpb.Lease\",grpc_type=\"bidi_stream\"}) - sum(grpc_server_handled_total{grpc_service=\"etcdserverpb.Lease\",grpc_type=\"bidi_stream\"})", - "interval": "", - "legendFormat": "Lease Watch Stream", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Active Streams", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 7 - }, - "hiddenSeries": false, - "id": 5, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(etcd_server_proposals_committed_total[$__rate_interval]))", - "interval": "", - "legendFormat": "Proposal Committed", - "refId": "A" - }, - { - "expr": "sum(rate(etcd_server_proposals_applied_total[$__rate_interval]))", - "interval": "", - "legendFormat": "Proposal Applied", - "refId": "B" - }, - { - "expr": "sum(rate(etcd_server_proposals_failed_total[$__rate_interval]))", - "interval": "", - "legendFormat": "Proposal Failed", - "refId": "C" - }, - { - "expr": "sum(etcd_server_proposals_pending)", - "interval": "", - "legendFormat": "Proposal Pending", - "refId": "D" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Raft Proposals", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 7 - }, - "hiddenSeries": false, - "id": 6, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(grpc_server_started_total{grpc_type=\"unary\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "RPC Rate", - "refId": "A" - }, - { - "expr": "sum(rate(grpc_server_handled_total{grpc_type=\"unary\",grpc_code!=\"OK\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "RPC Failure Rate", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "RPC Rate", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 0, - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "decimals": null, - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 7 - }, - "hiddenSeries": false, - "id": 7, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(etcd_disk_wal_fsync_duration_seconds_bucket[$__rate_interval])) by (instance, le))", - "interval": "", - "legendFormat": "WAL fsync", - "refId": "A" - }, - { - "expr": "histogram_quantile(0.99, sum(rate(etcd_disk_backend_commit_duration_seconds_bucket[$__rate_interval])) by (instance, le))", - "interval": "", - "legendFormat": "DB fsync", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Disk Sync Duration", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 2, - "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 - } - } - ], - "schemaVersion": 26, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "", - "title": "Rancher / etcd", - "uid": "rancher-etcd-1", - "version": 4 -} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/k8s/rancher-k8s-components-nodes.json b/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/k8s/rancher-k8s-components-nodes.json deleted file mode 100644 index b31358eaaf..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/k8s/rancher-k8s-components-nodes.json +++ /dev/null @@ -1,527 +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": 30, - "links": [], - "panels": [ - { - "aliasColors": { - "{{instance}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 0 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(apiserver_request_total[$__rate_interval])) by (instance, code)", - "interval": "", - "legendFormat": "{{code}}({{instance}})", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "API Server Request Rate", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 0, - "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": { - "{{instance}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Load[5m]({{instance}})" - }, - "properties": [] - } - ] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 0 - }, - "hiddenSeries": false, - "id": 3, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(workqueue_depth{component=\"kube-controller-manager\", name=\"deployment\"}) by (instance, name)", - "interval": "", - "legendFormat": "Deployment Depth ({{instance}})", - "refId": "A" - }, - { - "expr": "sum(workqueue_depth{component=\"kube-controller-manager\", name=\"volumes\"}) by (instance, name)", - "interval": "", - "legendFormat": "Volumes Depth ({{instance}})", - "refId": "B" - }, - { - "expr": "sum(workqueue_depth{component=\"kube-controller-manager\", name=\"replicaset\"}) by (instance, name)", - "interval": "", - "legendFormat": "ReplicaSet Depth ({{instance}})", - "refId": "C" - }, - { - "expr": "sum(workqueue_depth{component=\"kube-controller-manager\", name=\"service\"}) by (instance, name)", - "interval": "", - "legendFormat": "Service Depth ({{instance}})", - "refId": "D" - }, - { - "expr": "sum(workqueue_depth{component=\"kube-controller-manager\", name=\"serviceaccount\"}) by (instance, name)", - "interval": "", - "legendFormat": "ServiceAccount Depth ({{instance}})", - "refId": "E" - }, - { - "expr": "sum(workqueue_depth{component=\"kube-controller-manager\", name=\"endpoint\"}) by (instance, name)", - "interval": "", - "legendFormat": "Endpoint Depth ({{instance}})", - "refId": "F" - }, - { - "expr": "sum(workqueue_depth{component=\"kube-controller-manager\", name=\"daemonset\"}) by (instance, name)", - "interval": "", - "legendFormat": "DaemonSet Depth ({{instance}})", - "refId": "G" - }, - { - "expr": "sum(workqueue_depth{component=\"kube-controller-manager\", name=\"statefulset\"}) by (instance, name)", - "interval": "", - "legendFormat": "StatefulSet Depth ({{instance}})", - "refId": "H" - }, - { - "expr": "sum(workqueue_depth{component=\"kube-controller-manager\", name=\"replicationmanager\"}) by (instance, name)", - "interval": "", - "legendFormat": "ReplicationManager Depth ({{instance}})", - "refId": "I" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Controller Manager Queue Depth", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "{{instance}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 0 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(kube_pod_status_scheduled{condition=\"false\"})", - "interval": "", - "legendFormat": "Failed To Schedule", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Pod Scheduling Status", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "{{instance}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 7 - }, - "hiddenSeries": false, - "id": 5, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(nginx_ingress_controller_nginx_process_connections{state=\"reading\"}) by (instance)", - "interval": "", - "legendFormat": "Reading ({{instance}})", - "refId": "A" - }, - { - "expr": "sum(nginx_ingress_controller_nginx_process_connections{state=\"waiting\"}) by (instance)", - "interval": "", - "legendFormat": "Waiting ({{instance}})", - "refId": "B" - }, - { - "expr": "sum(nginx_ingress_controller_nginx_process_connections{state=\"writing\"}) by (instance)", - "interval": "", - "legendFormat": "Writing ({{instance}})", - "refId": "C" - }, - { - "expr": "sum(ceil(increase(nginx_ingress_controller_nginx_process_connections_total{state=\"accepted\"}[$__rate_interval]))) by (instance)", - "interval": "", - "legendFormat": "Accepted ({{instance}})", - "refId": "D" - }, - { - "expr": "sum(ceil(increase(nginx_ingress_controller_nginx_process_connections_total{state=\"handled\"}[$__rate_interval]))) by (instance)", - "interval": "", - "legendFormat": "Handled ({{instance}})", - "refId": "E" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Ingress Controller Connections", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "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 - } - } - ], - "schemaVersion": 26, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "", - "title": "Rancher / Kubernetes Components (Nodes)", - "uid": "rancher-k8s-components-nodes-1", - "version": 5 -} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/k8s/rancher-k8s-components.json b/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/k8s/rancher-k8s-components.json deleted file mode 100644 index 44cf97f9fd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/k8s/rancher-k8s-components.json +++ /dev/null @@ -1,519 +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": 31, - "links": [], - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 0 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(apiserver_request_total[$__rate_interval])) by (code)", - "interval": "", - "legendFormat": "{{code}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "API Server Request Rate", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 0, - "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": {} - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Load[5m]({{instance}})" - }, - "properties": [] - } - ] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 0 - }, - "hiddenSeries": false, - "id": 3, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(workqueue_depth{component=\"kube-controller-manager\", name=\"deployment\"}) by (name)", - "interval": "", - "legendFormat": "Deployment Depth", - "refId": "A" - }, - { - "expr": "sum(workqueue_depth{component=\"kube-controller-manager\", name=\"volumes\"}) by (name)", - "interval": "", - "legendFormat": "Volumes Depth", - "refId": "B" - }, - { - "expr": "sum(workqueue_depth{component=\"kube-controller-manager\", name=\"replicaset\"}) by (name)", - "interval": "", - "legendFormat": "Replicaset Depth", - "refId": "C" - }, - { - "expr": "sum(workqueue_depth{component=\"kube-controller-manager\", name=\"service\"}) by (name)", - "interval": "", - "legendFormat": "Service Depth", - "refId": "D" - }, - { - "expr": "sum(workqueue_depth{component=\"kube-controller-manager\", name=\"serviceaccount\"}) by (name)", - "interval": "", - "legendFormat": "ServiceAccount Depth", - "refId": "E" - }, - { - "expr": "sum(workqueue_depth{component=\"kube-controller-manager\", name=\"endpoint\"}) by (name)", - "interval": "", - "legendFormat": "Endpoint Depth", - "refId": "F" - }, - { - "expr": "sum(workqueue_depth{component=\"kube-controller-manager\", name=\"daemonset\"}) by (name)", - "interval": "", - "legendFormat": "DaemonSet Depth", - "refId": "G" - }, - { - "expr": "sum(workqueue_depth{component=\"kube-controller-manager\", name=\"statefulset\"}) by (name)", - "interval": "", - "legendFormat": "StatefulSet Depth", - "refId": "H" - }, - { - "expr": "sum(workqueue_depth{component=\"kube-controller-manager\", name=\"replicationmanager\"}) by (name)", - "interval": "", - "legendFormat": "ReplicationManager Depth", - "refId": "I" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Controller Manager Queue Depth", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "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", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 0 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(kube_pod_status_scheduled{condition=\"false\"})", - "interval": "", - "legendFormat": "Failed To Schedule", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Pod Scheduling Status", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "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", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 7 - }, - "hiddenSeries": false, - "id": 5, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(nginx_ingress_controller_nginx_process_connections{state=\"reading\"})", - "interval": "", - "legendFormat": "Reading", - "refId": "A" - }, - { - "expr": "sum(nginx_ingress_controller_nginx_process_connections{state=\"waiting\"})", - "interval": "", - "legendFormat": "Waiting", - "refId": "B" - }, - { - "expr": "sum(nginx_ingress_controller_nginx_process_connections{state=\"writing\"})", - "interval": "", - "legendFormat": "Writing", - "refId": "C" - }, - { - "expr": "sum(ceil(increase(nginx_ingress_controller_nginx_process_connections_total{state=\"accepted\"}[$__rate_interval])))", - "interval": "", - "legendFormat": "Accepted", - "refId": "D" - }, - { - "expr": "sum(ceil(increase(nginx_ingress_controller_nginx_process_connections_total{state=\"handled\"}[$__rate_interval])))", - "interval": "", - "legendFormat": "Handled", - "refId": "E" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Ingress Controller Connections", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "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 - } - } - ], - "schemaVersion": 26, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "", - "title": "Rancher / Kubernetes Components", - "uid": "rancher-k8s-components-1", - "version": 5 -} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/nodes/rancher-node-detail.json b/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/nodes/rancher-node-detail.json deleted file mode 100644 index 920fb94cf7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/nodes/rancher-node-detail.json +++ /dev/null @@ -1,805 +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": 28, - "links": [], - "panels": [ - { - "aliasColors": { - "{{mode}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 0 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "avg(irate({__name__=~\"node_cpu_seconds_total|windows_cpu_time_total\", instance=\"$instance\"}[$__rate_interval])) by (mode)", - "interval": "", - "legendFormat": "{{mode}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "CPU Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "percentunit", - "label": null, - "logBase": 1, - "max": "1", - "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", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Load[5m]" - }, - "properties": [] - } - ] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 0 - }, - "hiddenSeries": false, - "id": 3, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(node_load5{instance=~\"$instance\"} OR avg_over_time(windows_system_processor_queue_length{instance=~\"$instance\"}[5m]))", - "interval": "", - "legendFormat": "Load[5m]", - "refId": "A" - }, - { - "expr": "sum(node_load1{instance=~\"$instance\"} OR avg_over_time(windows_system_processor_queue_length{instance=~\"$instance\"}[1m]))", - "interval": "", - "legendFormat": "Load[1m]", - "refId": "B" - }, - { - "expr": "sum(node_load15{instance=~\"$instance\"} OR avg_over_time(windows_system_processor_queue_length{instance=~\"$instance\"}[15m]))", - "interval": "", - "legendFormat": "Load[15m]", - "refId": "C" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Load Average", - "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": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 0 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "1 - (node_memory_MemAvailable_bytes{instance=~\"$instance\"} OR windows_os_physical_memory_free_bytes{instance=~\"$instance\"}) / (node_memory_MemTotal_bytes{instance=~\"$instance\"} OR windows_cs_physical_memory_bytes{instance=~\"$instance\"})", - "interval": "", - "legendFormat": "Total", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Memory Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "percentunit", - "label": null, - "logBase": 1, - "max": "1", - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "{{device}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 7 - }, - "hiddenSeries": false, - "id": 5, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "1 - (sum(node_filesystem_free_bytes{device!~\"rootfs|HarddiskVolume.+\", instance=~\"$instance\"} OR windows_logical_disk_free_bytes{volume!~\"(HarddiskVolume.+|[A-Z]:.+)\", instance=~\"$instance\"}) by (device) / sum(node_filesystem_size_bytes{device!~\"rootfs|HarddiskVolume.+\", instance=~\"$instance\"} OR windows_logical_disk_size_bytes{volume!~\"(HarddiskVolume.+|[A-Z]:.+)\", instance=~\"$instance\"}) by (device))", - "interval": "", - "legendFormat": "{{device}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Disk Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "percentunit", - "label": null, - "logBase": 1, - "max": "1", - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "{{device}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 7 - }, - "hiddenSeries": false, - "id": 6, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(node_disk_read_bytes_total{instance=~\"$instance\"}[$__rate_interval]) OR rate(windows_logical_disk_read_bytes_total{instance=~\"$instance\"}[$__rate_interval])) by (device)", - "interval": "", - "legendFormat": "Read ({{device}})", - "refId": "A" - }, - { - "expr": "sum(rate(node_disk_written_bytes_total{instance=~\"$instance\"}[$__rate_interval]) OR rate(windows_logical_disk_write_bytes_total{instance=~\"$instance\"}[$__rate_interval])) by (device)", - "interval": "", - "legendFormat": "Write ({{device}})", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Disk I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "Bps", - "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": { - "{{device}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 7 - }, - "hiddenSeries": false, - "id": 7, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(node_network_receive_errs_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\", instance=~\"$instance\"}[$__rate_interval])) by (device) OR sum(rate(windows_net_packets_received_errors_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*', instance=~\"$instance\"}[$__rate_interval])) by (device)", - "interval": "", - "legendFormat": "Receive Errors ({{device}})", - "refId": "A" - }, - { - "expr": "sum(rate(node_network_receive_packets_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\", instance=~\"$instance\"}[$__rate_interval])) by (device) OR sum(rate(windows_net_packets_received_total_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*', instance=~\"$instance\"}[$__rate_interval])) by (device)", - "interval": "", - "legendFormat": "Receive Total ({{device}})", - "refId": "B" - }, - { - "expr": "sum(rate(node_network_transmit_errs_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\", instance=~\"$instance\"}[$__rate_interval])) by (device) OR sum(rate(windows_net_packets_outbound_errors_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*', instance=~\"$instance\"}[$__rate_interval])) by (device)", - "interval": "", - "legendFormat": "Transmit Errors ({{device}})", - "refId": "C" - }, - { - "expr": "sum(rate(node_network_receive_drop_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\", instance=~\"$instance\"}[$__rate_interval])) by (device) OR sum(rate(windows_net_packets_received_discarded_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*', instance=~\"$instance\"}[$__rate_interval])) by (device)", - "interval": "", - "legendFormat": "Receive Dropped ({{device}})", - "refId": "D" - }, - { - "expr": "sum(rate(node_network_transmit_drop_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\", instance=~\"$instance\"}[$__rate_interval])) by (device) OR sum(rate(windows_net_packets_outbound_discarded{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*', instance=~\"$instance\"}[$__rate_interval])) by (device)", - "interval": "", - "legendFormat": "Transmit Dropped ({{device}})", - "refId": "E" - }, - { - "expr": "sum(rate(node_network_transmit_packets_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\", instance=~\"$instance\"}[$__rate_interval])) by (device) OR sum(rate(windows_net_packets_sent_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*', instance=~\"$instance\"}[$__rate_interval])) by (device)", - "interval": "", - "legendFormat": "Transmit Total ({{device}})", - "refId": "F" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network Traffic", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "pps", - "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": { - "{{device}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 14 - }, - "hiddenSeries": false, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(node_network_transmit_bytes_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\", instance=~\"$instance\"}[$__rate_interval]) OR rate(windows_net_packets_sent_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*', instance=~\"$instance\"}[$__rate_interval])) by (device)", - "interval": "", - "legendFormat": "Transmit Total ({{device}})", - "refId": "A" - }, - { - "expr": "sum(rate(node_network_receive_bytes_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\", instance=~\"$instance\"}[$__rate_interval]) OR rate(windows_net_packets_received_total_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*', instance=~\"$instance\"}[$__rate_interval])) by (device)", - "interval": "", - "legendFormat": "Receive Total ({{device}})", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "schemaVersion": 26, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "instance", - "query": "label_values({__name__=~\"node_exporter_build_info|windows_exporter_build_info\"}, instance)", - "refresh": 2, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "", - "title": "Rancher / Node (Detail)", - "uid": "rancher-node-detail-1", - "version": 3 -} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/nodes/rancher-node.json b/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/nodes/rancher-node.json deleted file mode 100644 index 367df3cc9d..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/nodes/rancher-node.json +++ /dev/null @@ -1,792 +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": 28, - "links": [], - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 0 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "1 - avg(irate({__name__=~\"node_cpu_seconds_total|windows_cpu_time_total\", instance=\"$instance\", mode=\"idle\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Total", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "CPU Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "percentunit", - "label": null, - "logBase": 1, - "max": "1", - "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", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Load[5m]" - }, - "properties": [] - } - ] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 0 - }, - "hiddenSeries": false, - "id": 3, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(node_load5{instance=~\"$instance\"} OR avg_over_time(windows_system_processor_queue_length{instance=~\"$instance\"}[5m]))", - "interval": "", - "legendFormat": "Load[5m]", - "refId": "A" - }, - { - "expr": "sum(node_load1{instance=~\"$instance\"} OR avg_over_time(windows_system_processor_queue_length{instance=~\"$instance\"}[1m]))", - "interval": "", - "legendFormat": "Load[1m]", - "refId": "B" - }, - { - "expr": "sum(node_load15{instance=~\"$instance\"} OR avg_over_time(windows_system_processor_queue_length{instance=~\"$instance\"}[15m]))", - "interval": "", - "legendFormat": "Load[15m]", - "refId": "C" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Load Average", - "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": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 0 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "1 - sum(node_memory_MemAvailable_bytes{instance=~\"$instance\"} OR windows_os_physical_memory_free_bytes{instance=~\"$instance\"}) / sum(node_memory_MemTotal_bytes{instance=~\"$instance\"} OR windows_cs_physical_memory_bytes{instance=~\"$instance\"})", - "interval": "", - "legendFormat": "Total", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Memory Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "percentunit", - "label": null, - "logBase": 1, - "max": "1", - "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", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 7 - }, - "hiddenSeries": false, - "id": 5, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "1 - (sum(node_filesystem_free_bytes{device!~\"rootfs|HarddiskVolume.+\", instance=~\"$instance\"} OR windows_logical_disk_free_bytes{volume!~\"(HarddiskVolume.+|[A-Z]:.+)\", instance=~\"$instance\"}) / sum(node_filesystem_size_bytes{device!~\"rootfs|HarddiskVolume.+\", instance=~\"$instance\"} OR windows_logical_disk_size_bytes{volume!~\"(HarddiskVolume.+|[A-Z]:.+)\", instance=~\"$instance\"}))", - "interval": "", - "legendFormat": "Total", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Disk Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "percentunit", - "label": null, - "logBase": 1, - "max": "1", - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 7 - }, - "hiddenSeries": false, - "id": 6, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(node_disk_read_bytes_total{instance=~\"$instance\"}[$__rate_interval]) OR rate(windows_logical_disk_read_bytes_total{instance=~\"$instance\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Read", - "refId": "A" - }, - { - "expr": "sum(rate(node_disk_written_bytes_total{instance=~\"$instance\"}[$__rate_interval]) OR rate(windows_logical_disk_write_bytes_total{instance=~\"$instance\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Write", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Disk I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "Bps", - "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 - } - }, - { - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 7 - }, - "hiddenSeries": false, - "id": 7, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(rate(node_network_receive_errs_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\", instance=~\"$instance\"}[$__rate_interval])) OR on() vector(0)) + (sum(rate(windows_net_packets_received_errors_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*', instance=~\"$instance\"}[$__rate_interval])) OR on() vector(0))", - "interval": "", - "legendFormat": "Receive Errors", - "refId": "A" - }, - { - "expr": "(sum(rate(node_network_receive_packets_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\", instance=~\"$instance\"}[$__rate_interval])) OR on() vector(0)) + (sum(rate(windows_net_packets_received_total_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*', instance=~\"$instance\"}[$__rate_interval])) OR on() vector(0))", - "interval": "", - "legendFormat": "Receive Total", - "refId": "B" - }, - { - "expr": "(sum(rate(node_network_transmit_errs_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\", instance=~\"$instance\"}[$__rate_interval])) OR on() vector(0)) + (sum(rate(windows_net_packets_outbound_errors_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*', instance=~\"$instance\"}[$__rate_interval])) OR on() vector(0))", - "interval": "", - "legendFormat": "Transmit Errors", - "refId": "C" - }, - { - "expr": "(sum(rate(node_network_receive_drop_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\", instance=~\"$instance\"}[$__rate_interval])) OR on() vector(0)) + (sum(rate(windows_net_packets_received_discarded_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*', instance=~\"$instance\"}[$__rate_interval])) OR on() vector(0))", - "interval": "", - "legendFormat": "Receive Dropped", - "refId": "D" - }, - { - "expr": "(sum(rate(node_network_transmit_drop_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\", instance=~\"$instance\"}[$__rate_interval])) OR on() vector(0)) + (sum(rate(windows_net_packets_outbound_discarded{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*', instance=~\"$instance\"}[$__rate_interval])) OR on() vector(0))", - "interval": "", - "legendFormat": "Transmit Dropped", - "refId": "E" - }, - { - "expr": "(sum(rate(node_network_transmit_packets_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\", instance=~\"$instance\"}[$__rate_interval])) OR on() vector(0)) + (sum(rate(windows_net_packets_sent_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*', instance=~\"$instance\"}[$__rate_interval])) OR on() vector(0))", - "interval": "", - "legendFormat": "Transmit Total", - "refId": "F" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network Traffic", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "pps", - "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 - } - }, - { - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 14 - }, - "hiddenSeries": false, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(node_network_transmit_bytes_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\", instance=~\"$instance\"}[$__rate_interval]) OR rate(windows_net_packets_sent_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*', instance=~\"$instance\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Transmit Total", - "refId": "A" - }, - { - "expr": "sum(rate(node_network_receive_bytes_total{device!~\"lo|veth.*|docker.*|flannel.*|cali.*|cbr.*\", instance=~\"$instance\"}[$__rate_interval]) OR rate(windows_net_packets_received_total_total{nic!~'.*isatap.*|.*VPN.*|.*Pseudo.*|.*tunneling.*', instance=~\"$instance\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Receive Total", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "schemaVersion": 26, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "instance", - "query": "label_values({__name__=~\"node_exporter_build_info|windows_exporter_build_info\"}, instance)", - "refresh": 2, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "", - "title": "Rancher / Node", - "uid": "rancher-node-1", - "version": 3 -} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/performance/performance-debugging.json b/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/performance/performance-debugging.json deleted file mode 100644 index 454bc39390..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/performance/performance-debugging.json +++ /dev/null @@ -1,1652 +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, - "links": [], - "liveNow": false, - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 16, - "x": 0, - "y": 0 - }, - "hiddenSeries": false, - "id": 22, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.1.5", - "pointradius": 2, - "points": true, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "exemplar": true, - "expr": "topk(20,sum by (handler_name) (rate(lasso_controller_reconcile_time_seconds_sum[5m]))\n/\nsum by (handler_name) (rate(lasso_controller_reconcile_time_seconds_count[5m])))", - "interval": "", - "legendFormat": "{{handler_name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Handler Average Execution Times Over Last 5 Minutes (Top 20)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:1390", - "format": "short", - "label": "Execution Time in Seconds", - "logBase": 1, - "show": true - }, - { - "$$hashKey": "object:1391", - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" - }, - "description": "", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 16, - "x": 0, - "y": 8 - }, - "hiddenSeries": false, - "id": 28, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "exemplar": true, - "expr": "topk(20,sum by (resource, method, code) (rate(steve_api_request_time_sum{resource!=\"subscribe\"}[5m]))\n/\nsum by (resource, method, code) (rate(steve_api_request_time_count{resource!=\"subscribe\"}[5m])))", - "interval": "", - "legendFormat": "{{resource}} {{method}} {{code}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Rancher API Average Request Times Over Last 5 Minutes (Top 20) (Subscribes Omitted)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:178", - "format": "ms", - "label": "", - "logBase": 1, - "show": true - }, - { - "$$hashKey": "object:179", - "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": 16, - "x": 0, - "y": 16 - }, - "hiddenSeries": false, - "id": 30, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "exemplar": true, - "expr": "rate(steve_api_request_time_sum{resource=\"subscribe\"}[5m])\n/\nrate(steve_api_request_time_count{resource=\"subscribe\"}[5m])", - "interval": "", - "legendFormat": "{{resource}} {{method}} {{code}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Subscribe Average Request Times Over Last 5 Minutes", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:368", - "format": "ms", - "label": "", - "logBase": 1, - "show": true - }, - { - "$$hashKey": "object:369", - "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": 16, - "x": 0, - "y": 24 - }, - "hiddenSeries": false, - "id": 14, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "exemplar": true, - "expr": "topk(20,workqueue_depth)", - "interval": "", - "legendFormat": "{{name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Lasso Controller Work Queue Depth (Top 20)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:1553", - "format": "short", - "logBase": 1, - "show": true - }, - { - "$$hashKey": "object:1554", - "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": 13, - "w": 16, - "x": 0, - "y": 32 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "exemplar": true, - "expr": "topk(20,sum by (id, resource, method, code) (steve_api_total_requests))", - "instant": false, - "interval": "", - "legendFormat": "{{id}} {{resource}} {{method}} {{code}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Number of Rancher Requests (Top 20)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:290", - "format": "short", - "logBase": 1, - "show": true - }, - { - "$$hashKey": "object:291", - "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": 9, - "w": 16, - "x": 0, - "y": 45 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "exemplar": true, - "expr": "topk(20,sum by (id, resource, method) (steve_api_total_requests{code!=\"200\",code!=\"201\"}))", - "interval": "", - "legendFormat": "{{id}} {{resource}} {{method}} {{code}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Number of Failed Rancher API Requests (Top 20)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:428", - "format": "short", - "logBase": 1, - "show": true - }, - { - "$$hashKey": "object:429", - "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": 16, - "x": 0, - "y": 54 - }, - "hiddenSeries": false, - "id": 6, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "exemplar": true, - "expr": "topk(20,sum by (resource, method, code) (rate(k8s_proxy_store_request_time_sum[5m]))\n/\nsum by (resource, method, code) (rate(k8s_proxy_store_request_time_count[5m])))", - "interval": "", - "legendFormat": "{{resource}} {{method}} {{code}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "K8s Proxy Store Average Request Times Over Last 5 Minutes (Top 20)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:662", - "format": "ms", - "label": "", - "logBase": 1, - "show": true - }, - { - "$$hashKey": "object:663", - "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": 16, - "x": 0, - "y": 62 - }, - "hiddenSeries": false, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.1.5", - "pointradius": 2, - "points": true, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "exemplar": true, - "expr": "topk(20,sum by (resource, method, code) (rate(k8s_proxy_client_request_time_sum[5m]))\n/\nsum by (resource, method, code) (rate(k8s_proxy_client_request_time_count[5m])))", - "interval": "", - "legendFormat": "{{resource}} {{method}} {{code}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "K8s Proxy Client Average Request Times Over Last 5 Minutes (Top 20)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:1710", - "format": "ms", - "label": "", - "logBase": 1, - "show": true - }, - { - "$$hashKey": "object:1711", - "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": 16, - "x": 0, - "y": 70 - }, - "hiddenSeries": false, - "id": 10, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "exemplar": true, - "expr": "topk(20,lasso_controller_total_cached_object)", - "interval": "", - "legendFormat": "{{kind}} {{version}} {{group}} {{pod}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Cached Objects by GroupVersionKind (Top 20)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:744", - "format": "short", - "logBase": 1, - "show": true - }, - { - "$$hashKey": "object:745", - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" - }, - "description": "", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 16, - "x": 0, - "y": 78 - }, - "hiddenSeries": false, - "id": 12, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "exemplar": true, - "expr": "topk(20,sum by (handler_name) (\nlasso_controller_total_handler_execution\n))", - "interval": "", - "legendFormat": "{{handler_name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Lasso Handler Executions (Top 20)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:824", - "format": "short", - "logBase": 1, - "show": true - }, - { - "$$hashKey": "object:825", - "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": 16, - "x": 0, - "y": 86 - }, - "hiddenSeries": false, - "id": 32, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "exemplar": true, - "expr": "topk(20, sum by (handler_name,controller_name) (\nincrease(lasso_controller_total_handler_execution[2m])\n))", - "interval": "", - "legendFormat": "{{controller_name}}.{{handler_name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Handler Executions Over Last 2 Minutes (Top 20)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "logBase": 1, - "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": 16, - "x": 0, - "y": 94 - }, - "hiddenSeries": false, - "id": 20, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "exemplar": true, - "expr": "topk(20,sum by (handler_name) (\nlasso_controller_total_handler_execution{has_error=\"true\"}\n))", - "interval": "", - "legendFormat": "{{handler_name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Total Handler Executions with Error (Top 20)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:1230", - "format": "short", - "logBase": 1, - "show": true - }, - { - "$$hashKey": "object:1231", - "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": 16, - "x": 0, - "y": 102 - }, - "hiddenSeries": false, - "id": 34, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "exemplar": true, - "expr": "topk(20,sum by (handler_name,controller_name) (\nincrease(lasso_controller_total_handler_execution{has_error=\"true\"}[2m])\n))", - "interval": "", - "legendFormat": "{{controller_name}}.{{handler_name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Handler Executions Over Last 2 Minutes (Top 20)", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "logBase": 1, - "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": 16, - "x": 0, - "y": 110 - }, - "hiddenSeries": false, - "id": 16, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "exemplar": true, - "expr": "topk(20,session_server_total_transmit_bytes)", - "interval": "", - "legendFormat": "{{clientkey}} {{pod}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Data Transmitted by Remote Dialer Sessions (Top 20)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:1953", - "format": "decbytes", - "label": "", - "logBase": 1, - "show": true - }, - { - "$$hashKey": "object:1954", - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" - }, - "description": "", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 16, - "x": 0, - "y": 118 - }, - "hiddenSeries": false, - "id": 18, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "exemplar": true, - "expr": "session_server_total_transmit_error_bytes", - "interval": "", - "legendFormat": "{{clientkey}} {{pod}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Errors for Remote Dialer Sessions (Top 20)", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:2045", - "format": "ms", - "label": "Error Data", - "logBase": 1, - "show": true - }, - { - "$$hashKey": "object:2046", - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "type": "prometheus", - "uid": "$datasource" - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 16, - "x": 0, - "y": 126 - }, - "hiddenSeries": false, - "id": 26, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "editorMode": "code", - "exemplar": true, - "expr": "session_server_total_add_websocket_session - (session_server_total_remove_websocket_session or (0 * session_server_total_add_websocket_session))", - "interval": "", - "legendFormat": "{{clientkey}} {{pod}}", - "range": true, - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Remote Dialer Active Connections (Top 20)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:2199", - "format": "short", - "logBase": 1, - "show": true - }, - { - "$$hashKey": "object:2200", - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "type": "prometheus", - "uid": "$datasource" - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 16, - "x": 0, - "y": 134 - }, - "hiddenSeries": false, - "id": 35, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "editorMode": "code", - "exemplar": true, - "expr": "rate(session_server_total_remove_connections[$__rate_interval])", - "interval": "", - "legendFormat": "{{clientkey}} {{pod}}", - "range": true, - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Remote Dialer Removed Connections Rate (Top 20)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:2199", - "format": "short", - "logBase": 1, - "show": true - }, - { - "$$hashKey": "object:2200", - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "type": "prometheus", - "uid": "$datasource" - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 16, - "x": 0, - "y": 142 - }, - "hiddenSeries": false, - "id": 24, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "editorMode": "code", - "exemplar": true, - "expr": "rate(session_server_total_add_connections[$__rate_interval])", - "interval": "", - "legendFormat": "{{clientkey}} {{pod}}", - "range": true, - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Remote Dialer Added Connections Rate (Top 20)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:2117", - "format": "short", - "logBase": 1, - "show": true - }, - { - "$$hashKey": "object:2118", - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } - } - ], - "schemaVersion": 37, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "selected": false, - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "includeAll": false, - "label": "Data Source", - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - } - ] - }, - "time": { - "from": "now-15m", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "Rancher Performance Debugging", - "uid": "tfrfU0a7k", - "version": 1, - "weekStart": "" -} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/pods/rancher-pod-containers.json b/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/pods/rancher-pod-containers.json deleted file mode 100644 index 9e53081a73..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/pods/rancher-pod-containers.json +++ /dev/null @@ -1,636 +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": 28, - "iteration": 1618265214337, - "links": [], - "panels": [ - { - "aliasColors": { - "{{container}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 0 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(container_cpu_cfs_throttled_seconds_total{container!=\"POD\",namespace=~\"$namespace\",pod=~\"$pod\", container!=\"\"}[$__rate_interval])) by (container)", - "interval": "", - "legendFormat": "CFS throttled ({{container}})", - "refId": "A" - }, - { - "expr": "sum(rate(container_cpu_system_seconds_total{container!=\"POD\",namespace=~\"$namespace\",pod=~\"$pod\",container!=\"\"}[$__rate_interval])) by (container) OR sum(rate(windows_container_cpu_usage_seconds_kernelmode{container!=\"POD\",namespace=~\"$namespace\",pod=~\"$pod\",container!=\"\"}[$__rate_interval])) by (container)", - "interval": "", - "legendFormat": "System ({{container}})", - "refId": "B" - }, - { - "expr": "sum(rate(container_cpu_usage_seconds_total{container!=\"POD\",namespace=~\"$namespace\",pod=~\"$pod\",container!=\"\"}[$__rate_interval])) by (container) OR sum(rate(windows_container_cpu_usage_seconds_total{container!=\"POD\",namespace=~\"$namespace\",pod=~\"$pod\",container!=\"\"}[$__rate_interval])) by (container)", - "interval": "", - "legendFormat": "Total ({{container}})", - "refId": "C" - }, - { - "expr": "sum(rate(container_cpu_user_seconds_total{container!=\"POD\",namespace=~\"$namespace\",pod=~\"$pod\",container!=\"\"}[$__rate_interval])) by (container) OR sum(rate(windows_container_cpu_usage_seconds_usermode{container!=\"POD\",namespace=~\"$namespace\",pod=~\"$pod\",container!=\"\"}[$__rate_interval])) by (container)", - "interval": "", - "legendFormat": "User ({{container}})", - "refId": "D" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "CPU Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "cpu", - "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": { - "{{container}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 0 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(container_memory_working_set_bytes{container!=\"POD\",namespace=~\"$namespace\",pod=~\"$pod\", container!=\"\"} OR windows_container_memory_usage_commit_bytes{container!=\"POD\",namespace=~\"$namespace\",pod=~\"$pod\", container!=\"\"}) by (container)", - "interval": "", - "legendFormat": "({{container}})", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Memory Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "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": { - "{{container}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 0 - }, - "hiddenSeries": false, - "id": 7, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_packets_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) by (container) OR sum(irate(windows_container_network_receive_packets_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) by (container)", - "interval": "", - "legendFormat": "Receive Total ({{container}})", - "refId": "A" - }, - { - "expr": "sum(irate(container_network_transmit_packets_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) by (container) OR sum(irate(windows_container_network_transmit_packets_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) by (container)", - "interval": "", - "legendFormat": "Transmit Total ({{container}})", - "refId": "B" - }, - { - "expr": "sum(irate(container_network_receive_packets_dropped_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) by (container) OR sum(irate(windows_container_network_receive_packets_dropped_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) by (container)", - "interval": "", - "legendFormat": "Receive Dropped ({{container}})", - "refId": "C" - }, - { - "expr": "sum(irate(container_network_receive_errors_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) by (container)", - "interval": "", - "legendFormat": "Receive Errors ({{container}})", - "refId": "D" - }, - { - "expr": "sum(irate(container_network_transmit_errors_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) by (container)", - "interval": "", - "legendFormat": "Transmit Errors ({{container}})", - "refId": "E" - }, - { - "expr": "sum(irate(container_network_transmit_packets_dropped_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) by (container) OR sum(irate(windows_container_network_transmit_packets_dropped_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) by (container)", - "interval": "", - "legendFormat": "Transmit Dropped ({{container}})", - "refId": "F" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network Traffic", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "pps", - "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": { - "{{container}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 7 - }, - "hiddenSeries": false, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_bytes_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) by (container) OR sum(irate(windows_container_network_receive_bytes_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) by (container)", - "interval": "", - "legendFormat": "Receive Total ({{container}})", - "refId": "A" - }, - { - "expr": "sum(irate(container_network_transmit_bytes_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) by (container) OR sum(irate(windows_container_network_transmit_bytes_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) by (container)", - "interval": "", - "legendFormat": "Transmit Total ({{container}})", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "Bps", - "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": { - "{{container}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 7 - }, - "hiddenSeries": false, - "id": 6, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(container_fs_writes_bytes_total{namespace=~\"$namespace\",pod=~\"$pod\",container!=\"\"}[$__rate_interval])) by (container)", - "interval": "", - "legendFormat": "Write ({{container}})", - "refId": "A" - }, - { - "expr": "sum(rate(container_fs_reads_bytes_total{namespace=~\"$namespace\",pod=~\"$pod\",container!=\"\"}[$__rate_interval])) by (container)", - "interval": "", - "legendFormat": "Read ({{container}})", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Disk I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 26, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "namespace", - "query": "label_values(kube_pod_info{cluster=\"$cluster\"}, namespace)", - "refresh": 2, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "pod", - "query": "label_values(kube_pod_info{cluster=\"$cluster\", namespace=\"$namespace\"}, pod)", - "refresh": 2, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "", - "title": "Rancher / Pod (Containers)", - "uid": "rancher-pod-containers-1", - "version": 8 -} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/pods/rancher-pod.json b/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/pods/rancher-pod.json deleted file mode 100644 index 65c6bf18ed..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/pods/rancher-pod.json +++ /dev/null @@ -1,636 +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": 28, - "iteration": 1618265214337, - "links": [], - "panels": [ - { - "aliasColors": { - "": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 0 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(container_cpu_cfs_throttled_seconds_total{container!=\"POD\",namespace=~\"$namespace\",pod=~\"$pod\", container!=\"\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "CFS throttled", - "refId": "A" - }, - { - "expr": "sum(rate(container_cpu_system_seconds_total{container!=\"POD\",namespace=~\"$namespace\",pod=~\"$pod\",container!=\"\"}[$__rate_interval])) OR sum(rate(windows_container_cpu_usage_seconds_kernelmode{container!=\"POD\",namespace=~\"$namespace\",pod=~\"$pod\",container!=\"\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "System", - "refId": "B" - }, - { - "expr": "sum(rate(container_cpu_usage_seconds_total{container!=\"POD\",namespace=~\"$namespace\",pod=~\"$pod\",container!=\"\"}[$__rate_interval])) OR sum(rate(windows_container_cpu_usage_seconds_total{container!=\"POD\",namespace=~\"$namespace\",pod=~\"$pod\",container!=\"\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Total", - "refId": "C" - }, - { - "expr": "sum(rate(container_cpu_user_seconds_total{container!=\"POD\",namespace=~\"$namespace\",pod=~\"$pod\",container!=\"\"}[$__rate_interval])) OR sum(rate(windows_container_cpu_usage_seconds_usermode{container!=\"POD\",namespace=~\"$namespace\",pod=~\"$pod\",container!=\"\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "User", - "refId": "D" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "CPU Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "cpu", - "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": { - "": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 0 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(container_memory_working_set_bytes{container!=\"POD\",namespace=~\"$namespace\",pod=~\"$pod\", container!=\"\"} OR windows_container_memory_usage_commit_bytes{container!=\"POD\",namespace=~\"$namespace\",pod=~\"$pod\", container!=\"\"})", - "interval": "", - "legendFormat": "Total", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Memory Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "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": { - "": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 0 - }, - "hiddenSeries": false, - "id": 7, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_packets_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) OR sum(irate(windows_container_network_receive_packets_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Receive Total", - "refId": "A" - }, - { - "expr": "sum(irate(container_network_transmit_packets_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) OR sum(irate(windows_container_network_transmit_packets_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Transmit Total", - "refId": "B" - }, - { - "expr": "sum(irate(container_network_receive_packets_dropped_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) OR sum(irate(windows_container_network_receive_packets_dropped_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Receive Dropped", - "refId": "C" - }, - { - "expr": "sum(irate(container_network_receive_errors_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Receive Errors", - "refId": "D" - }, - { - "expr": "sum(irate(container_network_transmit_errors_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Transmit Errors", - "refId": "E" - }, - { - "expr": "sum(irate(container_network_transmit_packets_dropped_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) OR sum(irate(windows_container_network_transmit_packets_dropped_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Transmit Dropped", - "refId": "F" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network Traffic", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "pps", - "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": { - "": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 7 - }, - "hiddenSeries": false, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_bytes_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) OR sum(irate(windows_container_network_receive_bytes_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Receive Total", - "refId": "A" - }, - { - "expr": "sum(irate(container_network_transmit_bytes_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval])) OR sum(irate(windows_container_network_transmit_bytes_total{namespace=~\"$namespace\",pod=~\"$pod\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Transmit Total", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "Bps", - "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": { - "": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 7 - }, - "hiddenSeries": false, - "id": 6, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(container_fs_writes_bytes_total{namespace=~\"$namespace\",pod=~\"$pod\",container!=\"\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Write", - "refId": "A" - }, - { - "expr": "sum(rate(container_fs_reads_bytes_total{namespace=~\"$namespace\",pod=~\"$pod\",container!=\"\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Read", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Disk I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 26, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "namespace", - "query": "label_values({__name__=~\"container_.*|windows_container_.*\", namespace!=\"\"}, namespace)", - "refresh": 2, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "pod", - "query": "label_values({__name__=~\"container_.*|windows_container_.*\", namespace=\"$namespace\", pod!=\"\"}, pod)", - "refresh": 2, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "", - "title": "Rancher / Pod", - "uid": "rancher-pod-1", - "version": 8 -} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/workloads/rancher-workload-pods.json b/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/workloads/rancher-workload-pods.json deleted file mode 100644 index f6b5078afb..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/workloads/rancher-workload-pods.json +++ /dev/null @@ -1,652 +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": 28, - "iteration": 1618265214337, - "links": [], - "panels": [ - { - "aliasColors": { - "{{pod}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 0 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(rate(container_cpu_cfs_throttled_seconds_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"}", - "interval": "", - "legendFormat": "CFS throttled ({{pod}})", - "refId": "A" - }, - { - "expr": "(sum(rate(container_cpu_system_seconds_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod) OR sum(rate(windows_container_cpu_usage_seconds_kernelmode{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"}", - "interval": "", - "legendFormat": "System ({{pod}})", - "refId": "B" - }, - { - "expr": "(sum(rate(container_cpu_usage_seconds_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod) OR sum(rate(windows_container_cpu_usage_seconds_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"}", - "interval": "", - "legendFormat": "Total ({{pod}})", - "refId": "C" - }, - { - "expr": "(sum(rate(container_cpu_user_seconds_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod) OR sum(rate(windows_container_cpu_usage_seconds_usermode{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"}", - "interval": "", - "legendFormat": "User ({{pod}})", - "refId": "D" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "CPU Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "cpu", - "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": { - "{{pod}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 0 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(container_memory_working_set_bytes{namespace=~\"$namespace\"} OR windows_container_memory_usage_commit_bytes{namespace=~\"$namespace\"}) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"}", - "interval": "", - "legendFormat": "({{pod}})", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Memory Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "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": { - "{{pod}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 0 - }, - "hiddenSeries": false, - "id": 7, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(irate(container_network_receive_packets_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod) OR sum(irate(windows_container_network_receive_packets_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"}", - "interval": "", - "legendFormat": "Receive Total ({{pod}})", - "refId": "A" - }, - { - "expr": "(sum(irate(container_network_transmit_packets_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod) OR sum(irate(windows_container_network_transmit_packets_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"}", - "interval": "", - "legendFormat": "Transmit Total ({{pod}})", - "refId": "B" - }, - { - "expr": "(sum(irate(container_network_receive_packets_dropped_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod) OR sum(irate(windows_container_network_receive_packets_dropped_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"}", - "interval": "", - "legendFormat": "Receive Dropped ({{pod}})", - "refId": "C" - }, - { - "expr": "(sum(irate(container_network_receive_errors_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"}", - "interval": "", - "legendFormat": "Receive Errors ({{pod}})", - "refId": "D" - }, - { - "expr": "(sum(irate(container_network_transmit_errors_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"}", - "interval": "", - "legendFormat": "Transmit Errors ({{pod}})", - "refId": "E" - }, - { - "expr": "(sum(irate(container_network_transmit_packets_dropped_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod) OR sum(irate(windows_container_network_transmit_packets_dropped_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"}", - "interval": "", - "legendFormat": "Transmit Dropped ({{pod}})", - "refId": "F" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network Traffic", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "pps", - "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": { - "{{pod}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 7 - }, - "hiddenSeries": false, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(irate(container_network_receive_bytes_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod) OR sum(irate(windows_container_network_receive_bytes_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"}", - "interval": "", - "legendFormat": "Receive Total ({{pod}})", - "refId": "A" - }, - { - "expr": "(sum(irate(container_network_transmit_bytes_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod) OR sum(irate(windows_container_network_transmit_bytes_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"}", - "interval": "", - "legendFormat": "Transmit Total ({{pod}})", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "Bps", - "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": { - "{{pod}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 7 - }, - "hiddenSeries": false, - "id": 6, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(rate(container_fs_writes_bytes_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"}", - "interval": "", - "legendFormat": "Write ({{pod}})", - "refId": "A" - }, - { - "expr": "(sum(rate(container_fs_reads_bytes_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"}", - "interval": "", - "legendFormat": "Read ({{pod}})", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Disk I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 26, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "namespace", - "query": "query_result(kube_pod_info{namespace!=\"\"} * on(pod) group_right(namespace, created_by_kind, created_by_name) count({__name__=~\"container_.*|windows_container_.*\", pod!=\"\"}) by (pod))", - "refresh": 2, - "regex": "/.*namespace=\"([^\"]*)\"/", - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "kind", - "query": "query_result(kube_pod_info{namespace=\"$namespace\", created_by_kind!=\"\"} * on(pod) group_right(namespace, created_by_kind, created_by_name) count({__name__=~\"container_.*|windows_container_.*\", pod!=\"\"}) by (pod))", - "refresh": 2, - "regex": "/.*created_by_kind=\"([^\"]*)\"/", - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "workload", - "query": "query_result(kube_pod_info{namespace=\"$namespace\", created_by_kind=\"$kind\", created_by_name!=\"\"} * on(pod) group_right(namespace, created_by_kind, created_by_name) count({__name__=~\"container_.*|windows_container_.*\", pod!=\"\"}) by (pod))", - "refresh": 2, - "regex": "/.*created_by_name=\"([^\"]*)\"/", - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "", - "title": "Rancher / Workload (Pods)", - "uid": "rancher-workload-pods-1", - "version": 8 -} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/workloads/rancher-workload.json b/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/workloads/rancher-workload.json deleted file mode 100644 index 9f5317c2f0..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/files/rancher/workloads/rancher-workload.json +++ /dev/null @@ -1,652 +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": 28, - "iteration": 1618265214337, - "links": [], - "panels": [ - { - "aliasColors": { - "{{pod}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 0 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum((sum(rate(container_cpu_cfs_throttled_seconds_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"})", - "interval": "", - "legendFormat": "CFS throttled", - "refId": "A" - }, - { - "expr": "sum((sum(rate(container_cpu_system_seconds_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod) OR sum(rate(windows_container_cpu_usage_seconds_kernelmode{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"})", - "interval": "", - "legendFormat": "System", - "refId": "B" - }, - { - "expr": "sum((sum(rate(container_cpu_usage_seconds_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod) OR sum(rate(windows_container_cpu_usage_seconds_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"})", - "interval": "", - "legendFormat": "Total", - "refId": "C" - }, - { - "expr": "sum((sum(rate(container_cpu_user_seconds_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod) OR sum(rate(windows_container_cpu_usage_seconds_usermode{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"})", - "interval": "", - "legendFormat": "User", - "refId": "D" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "CPU Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "cpu", - "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": { - "{{pod}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 0 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum((sum(container_memory_working_set_bytes{namespace=~\"$namespace\"} OR windows_container_memory_usage_commit_bytes{namespace=~\"$namespace\"}) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"})", - "interval": "", - "legendFormat": "Total", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Memory Utilization", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "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": { - "{{pod}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 0 - }, - "hiddenSeries": false, - "id": 7, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum((sum(irate(container_network_receive_packets_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod) OR sum(irate(windows_container_network_receive_packets_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"})", - "interval": "", - "legendFormat": "Receive Total", - "refId": "A" - }, - { - "expr": "sum((sum(irate(container_network_transmit_packets_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod) OR sum(irate(windows_container_network_transmit_packets_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"})", - "interval": "", - "legendFormat": "Transmit Total", - "refId": "B" - }, - { - "expr": "sum((sum(irate(container_network_receive_packets_dropped_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod) OR sum(irate(windows_container_network_receive_packets_dropped_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"})", - "interval": "", - "legendFormat": "Receive Dropped", - "refId": "C" - }, - { - "expr": "sum((sum(irate(container_network_receive_errors_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"})", - "interval": "", - "legendFormat": "Receive Errors", - "refId": "D" - }, - { - "expr": "sum((sum(irate(container_network_transmit_errors_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"})", - "interval": "", - "legendFormat": "Transmit Errors", - "refId": "E" - }, - { - "expr": "sum((sum(irate(container_network_transmit_packets_dropped_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod) OR sum(irate(windows_container_network_transmit_packets_dropped_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"})", - "interval": "", - "legendFormat": "Transmit Dropped", - "refId": "F" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network Traffic", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "pps", - "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": { - "{{pod}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 7 - }, - "hiddenSeries": false, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum((sum(irate(container_network_receive_bytes_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod) OR sum(irate(windows_container_network_receive_bytes_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"})", - "interval": "", - "legendFormat": "Receive Total", - "refId": "A" - }, - { - "expr": "sum((sum(irate(container_network_transmit_bytes_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod) OR sum(irate(windows_container_network_transmit_bytes_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"})", - "interval": "", - "legendFormat": "Transmit Total", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "Bps", - "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": { - "{{pod}}": "#3797d5" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 7 - }, - "hiddenSeries": false, - "id": 6, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum((sum(rate(container_fs_writes_bytes_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"})", - "interval": "", - "legendFormat": "Write", - "refId": "A" - }, - { - "expr": "sum((sum(rate(container_fs_reads_bytes_total{namespace=~\"$namespace\"}[$__rate_interval])) by (pod)) * on(pod) kube_pod_info{namespace=~\"$namespace\", created_by_kind=\"$kind\", created_by_name=\"$workload\"})", - "interval": "", - "legendFormat": "Read", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Disk I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 26, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "namespace", - "query": "query_result(kube_pod_info{namespace!=\"\"} * on(pod) group_right(namespace, created_by_kind, created_by_name) count({__name__=~\"container_.*|windows_container_.*\", pod!=\"\"}) by (pod))", - "refresh": 2, - "regex": "/.*namespace=\"([^\"]*)\"/", - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "kind", - "query": "query_result(kube_pod_info{namespace=\"$namespace\", created_by_kind!=\"\"} * on(pod) group_right(namespace, created_by_kind, created_by_name) count({__name__=~\"container_.*|windows_container_.*\", pod!=\"\"}) by (pod))", - "refresh": 2, - "regex": "/.*created_by_kind=\"([^\"]*)\"/", - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "workload", - "query": "query_result(kube_pod_info{namespace=\"$namespace\", created_by_kind=\"$kind\", created_by_name!=\"\"} * on(pod) group_right(namespace, created_by_kind, created_by_name) count({__name__=~\"container_.*|windows_container_.*\", pod!=\"\"}) by (pod))", - "refresh": 2, - "regex": "/.*created_by_name=\"([^\"]*)\"/", - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "", - "title": "Rancher / Workload", - "uid": "rancher-workload-1", - "version": 8 -} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/files/upgrade/scripts/delete-workloads-with-old-labels.sh b/charts/rancher-monitoring/103.1.2+up45.31.1/files/upgrade/scripts/delete-workloads-with-old-labels.sh deleted file mode 100644 index 89431e7132..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/files/upgrade/scripts/delete-workloads-with-old-labels.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -set -e -set -x - -# node-exporter -kubectl delete daemonset -l app=prometheus-node-exporter,release=rancher-monitoring --ignore-not-found=true - -# prometheus-adapter -kubectl delete deployments -l app=prometheus-adapter,release=rancher-monitoring --ignore-not-found=true - -# kube-state-metrics -kubectl delete deployments -l app.kubernetes.io/instance=rancher-monitoring,app.kubernetes.io/name=kube-state-metrics --cascade=orphan --ignore-not-found=true -kubectl delete statefulsets -l app.kubernetes.io/instance=rancher-monitoring,app.kubernetes.io/name=kube-state-metrics --cascade=orphan --ignore-not-found=true diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/NOTES.txt b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/NOTES.txt deleted file mode 100644 index 371f3ae398..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/NOTES.txt +++ /dev/null @@ -1,4 +0,0 @@ -{{ $.Chart.Name }} has been installed. Check its status by running: - kubectl --namespace {{ template "kube-prometheus-stack.namespace" . }} get pods -l "release={{ $.Release.Name }}" - -Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator. diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/_helpers.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/_helpers.tpl deleted file mode 100644 index 102600a546..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/_helpers.tpl +++ /dev/null @@ -1,423 +0,0 @@ -# Rancher -{{- define "system_default_registry" -}} -{{- if .Values.global.cattle.systemDefaultRegistry -}} -{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} -{{- end -}} -{{- end -}} - -{{- define "monitoring_registry" -}} - {{- $temp_registry := (include "system_default_registry" .) -}} - {{- if $temp_registry -}} - {{- trimSuffix "/" $temp_registry -}} - {{- else -}} - {{- .Values.global.imageRegistry -}} - {{- end -}} -{{- end -}} - -{{/* -https://github.com/helm/helm/issues/4535#issuecomment-477778391 -Usage: {{ include "call-nested" (list . "SUBCHART_NAME" "TEMPLATE") }} -e.g. {{ include "call-nested" (list . "grafana" "grafana.fullname") }} -*/}} -{{- define "call-nested" }} -{{- $dot := index . 0 }} -{{- $subchart := index . 1 | splitList "." }} -{{- $template := index . 2 }} -{{- $values := $dot.Values }} -{{- range $subchart }} -{{- $values = index $values . }} -{{- end }} -{{- include $template (dict "Chart" (dict "Name" (last $subchart)) "Values" $values "Release" $dot.Release "Capabilities" $dot.Capabilities) }} -{{- end }} - -# Special Exporters -{{- define "exporter.kubeEtcd.enabled" -}} -{{- if or .Values.kubeEtcd.enabled .Values.rkeEtcd.enabled .Values.kubeAdmEtcd.enabled .Values.rke2Etcd.enabled -}} -"true" -{{- end -}} -{{- end }} - -{{- define "exporter.kubeControllerManager.enabled" -}} -{{- if or .Values.kubeControllerManager.enabled .Values.rkeControllerManager.enabled .Values.k3sServer.enabled .Values.kubeAdmControllerManager.enabled .Values.rke2ControllerManager.enabled -}} -"true" -{{- end -}} -{{- end }} - -{{- define "exporter.kubeScheduler.enabled" -}} -{{- if or .Values.kubeScheduler.enabled .Values.rkeScheduler.enabled .Values.k3sServer.enabled .Values.kubeAdmScheduler.enabled .Values.rke2Scheduler.enabled -}} -"true" -{{- end -}} -{{- end }} - -{{- define "exporter.kubeProxy.enabled" -}} -{{- if or .Values.kubeProxy.enabled .Values.rkeProxy.enabled .Values.k3sServer.enabled .Values.kubeAdmProxy.enabled .Values.rke2Proxy.enabled -}} -"true" -{{- end -}} -{{- end }} - -{{- define "exporter.kubelet.enabled" -}} -{{- if or .Values.kubelet.enabled .Values.hardenedKubelet.enabled .Values.k3sServer.enabled -}} -"true" -{{- end -}} -{{- end }} - -{{- define "exporter.kubeControllerManager.jobName" -}} -{{- if .Values.k3sServer.enabled -}} -k3s-server -{{- else -}} -kube-controller-manager -{{- end -}} -{{- end }} - -{{- define "exporter.kubeScheduler.jobName" -}} -{{- if .Values.k3sServer.enabled -}} -k3s-server -{{- else -}} -kube-scheduler -{{- end -}} -{{- end }} - -{{- define "exporter.kubeProxy.jobName" -}} -{{- if .Values.k3sServer.enabled -}} -k3s-server -{{- else -}} -kube-proxy -{{- end -}} -{{- end }} - -{{- define "exporter.kubelet.jobName" -}} -{{- if .Values.k3sServer.enabled -}} -k3s-server -{{- else -}} -kubelet -{{- end -}} -{{- end }} - -{{- define "kubelet.serviceMonitor.resourcePath" -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if not (eq .Values.kubelet.serviceMonitor.resourcePath "/metrics/resource/v1alpha1") -}} -{{ .Values.kubelet.serviceMonitor.resourcePath }} -{{- else if semverCompare ">=1.20.0-0" $kubeTargetVersion -}} -/metrics/resource -{{- else -}} -/metrics/resource/v1alpha1 -{{- end -}} -{{- end }} - -{{- define "rancher.serviceMonitor.selector" -}} -{{- if .Values.rancherMonitoring.selector }} -{{ .Values.rancherMonitoring.selector | toYaml }} -{{- else }} -{{- $rancherDeployment := (lookup "apps/v1" "Deployment" "cattle-system" "rancher") }} -{{- if $rancherDeployment }} -matchLabels: - app: rancher - chart: {{ index $rancherDeployment.metadata.labels "chart" }} - release: rancher -{{- end }} -{{- end }} -{{- end }} - -# Windows Support - -{{/* -Windows cluster will add default taint for linux nodes, -add below linux tolerations to workloads could be scheduled to those linux nodes -*/}} - -{{- define "linux-node-tolerations" -}} -- key: "cattle.io/os" - value: "linux" - effect: "NoSchedule" - operator: "Equal" -{{- end -}} - -{{- define "linux-node-selector" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -beta.kubernetes.io/os: linux -{{- else -}} -kubernetes.io/os: linux -{{- end -}} -{{- end -}} - -# Prometheus Operator - -{{/* vim: set filetype=mustache: */}} -{{/* Expand the name of the chart. This is suffixed with -alertmanager, which means subtract 13 from longest 63 available */}} -{{- define "kube-prometheus-stack.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 50 | 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. -The components in this chart create additional resources that expand the longest created name strings. -The longest name that gets created adds and extra 37 characters, so truncation should be 63-35=26. -*/}} -{{- define "kube-prometheus-stack.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 26 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 26 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 26 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* Fullname suffixed with operator */}} -{{- define "kube-prometheus-stack.operator.fullname" -}} -{{- printf "%s-operator" (include "kube-prometheus-stack.fullname" .) -}} -{{- end }} - -{{/* Prometheus custom resource instance name */}} -{{- define "kube-prometheus-stack.prometheus.crname" -}} -{{- if .Values.cleanPrometheusOperatorObjectNames }} -{{- include "kube-prometheus-stack.fullname" . }} -{{- else }} -{{- print (include "kube-prometheus-stack.fullname" .) "-prometheus" }} -{{- end }} -{{- end }} - -{{/* Prometheus apiVersion for networkpolicy */}} -{{- define "kube-prometheus-stack.prometheus.networkPolicy.apiVersion" -}} -{{- print "networking.k8s.io/v1" -}} -{{- end }} - -{{/* Alertmanager custom resource instance name */}} -{{- define "kube-prometheus-stack.alertmanager.crname" -}} -{{- if .Values.cleanPrometheusOperatorObjectNames }} -{{- include "kube-prometheus-stack.fullname" . }} -{{- else }} -{{- print (include "kube-prometheus-stack.fullname" .) "-alertmanager" -}} -{{- end }} -{{- end }} - -{{/* Fullname suffixed with thanos-ruler */}} -{{- define "kube-prometheus-stack.thanosRuler.fullname" -}} -{{- printf "%s-thanos-ruler" (include "kube-prometheus-stack.fullname" .) -}} -{{- end }} - -{{/* Shortened name suffixed with thanos-ruler */}} -{{- define "kube-prometheus-stack.thanosRuler.name" -}} -{{- default (printf "%s-thanos-ruler" (include "kube-prometheus-stack.name" .)) .Values.thanosRuler.name -}} -{{- end }} - - -{{/* Create chart name and version as used by the chart label. */}} -{{- define "kube-prometheus-stack.chartref" -}} -{{- replace "+" "_" .Chart.Version | printf "%s-%s" .Chart.Name -}} -{{- end }} - -{{/* Generate basic labels */}} -{{- define "kube-prometheus-stack.labels" }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/version: "{{ replace "+" "_" .Chart.Version }}" -app.kubernetes.io/part-of: {{ template "kube-prometheus-stack.name" . }} -chart: {{ template "kube-prometheus-stack.chartref" . }} -release: {{ $.Release.Name | quote }} -heritage: {{ $.Release.Service | quote }} -{{- if .Values.commonLabels}} -{{ toYaml .Values.commonLabels }} -{{- end }} -{{- end }} - -{{/* Create the name of kube-prometheus-stack service account to use */}} -{{- define "kube-prometheus-stack.operator.serviceAccountName" -}} -{{- if .Values.prometheusOperator.serviceAccount.create -}} - {{ default (include "kube-prometheus-stack.operator.fullname" .) .Values.prometheusOperator.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.prometheusOperator.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* Create the name of prometheus service account to use */}} -{{- define "kube-prometheus-stack.prometheus.serviceAccountName" -}} -{{- if .Values.prometheus.serviceAccount.create -}} - {{ default (print (include "kube-prometheus-stack.fullname" .) "-prometheus") .Values.prometheus.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.prometheus.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* Create the name of alertmanager service account to use */}} -{{- define "kube-prometheus-stack.alertmanager.serviceAccountName" -}} -{{- if .Values.alertmanager.serviceAccount.create -}} - {{ default (print (include "kube-prometheus-stack.fullname" .) "-alertmanager") .Values.alertmanager.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.alertmanager.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* Create the name of thanosRuler service account to use */}} -{{- define "kube-prometheus-stack.thanosRuler.serviceAccountName" -}} -{{- if .Values.thanosRuler.serviceAccount.create -}} - {{ default (include "kube-prometheus-stack.thanosRuler.name" .) .Values.thanosRuler.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.thanosRuler.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* -Allow the release namespace to be overridden for multi-namespace deployments in combined charts -*/}} -{{- define "kube-prometheus-stack.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{/* -Use the grafana namespace override for multi-namespace deployments in combined charts -*/}} -{{- define "kube-prometheus-stack-grafana.namespace" -}} - {{- if .Values.grafana.namespaceOverride -}} - {{- .Values.grafana.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{/* -Use the kube-state-metrics namespace override for multi-namespace deployments in combined charts -*/}} -{{- define "kube-prometheus-stack-kube-state-metrics.namespace" -}} - {{- if index .Values "kube-state-metrics" "namespaceOverride" -}} - {{- index .Values "kube-state-metrics" "namespaceOverride" -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{/* -Use the prometheus-node-exporter namespace override for multi-namespace deployments in combined charts -*/}} -{{- define "kube-prometheus-stack-prometheus-node-exporter.namespace" -}} - {{- if index .Values "prometheus-node-exporter" "namespaceOverride" -}} - {{- index .Values "prometheus-node-exporter" "namespaceOverride" -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} - -{{/* Allow KubeVersion to be overridden. */}} -{{- define "kube-prometheus-stack.kubeVersion" -}} - {{- default .Capabilities.KubeVersion.Version .Values.kubeVersionOverride -}} -{{- end -}} - -{{/* Get Ingress API Version */}} -{{- define "kube-prometheus-stack.ingress.apiVersion" -}} - {{- if and (.Capabilities.APIVersions.Has "networking.k8s.io/v1") (semverCompare ">= 1.19-0" (include "kube-prometheus-stack.kubeVersion" .)) -}} - {{- print "networking.k8s.io/v1" -}} - {{- else if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" -}} - {{- print "networking.k8s.io/v1beta1" -}} - {{- else -}} - {{- print "extensions/v1beta1" -}} - {{- end -}} -{{- end -}} - -{{/* Check Ingress stability */}} -{{- define "kube-prometheus-stack.ingress.isStable" -}} - {{- eq (include "kube-prometheus-stack.ingress.apiVersion" .) "networking.k8s.io/v1" -}} -{{- end -}} - -{{/* Check Ingress supports pathType */}} -{{/* pathType was added to networking.k8s.io/v1beta1 in Kubernetes 1.18 */}} -{{- define "kube-prometheus-stack.ingress.supportsPathType" -}} - {{- or (eq (include "kube-prometheus-stack.ingress.isStable" .) "true") (and (eq (include "kube-prometheus-stack.ingress.apiVersion" .) "networking.k8s.io/v1beta1") (semverCompare ">= 1.18-0" (include "kube-prometheus-stack.kubeVersion" .))) -}} -{{- end -}} - -{{/* Get Policy API Version */}} -{{- define "kube-prometheus-stack.pdb.apiVersion" -}} - {{- if and (.Capabilities.APIVersions.Has "policy/v1") (semverCompare ">= 1.21-0" (include "kube-prometheus-stack.kubeVersion" .)) -}} - {{- print "policy/v1" -}} - {{- else -}} - {{- print "policy/v1beta1" -}} - {{- end -}} - {{- end -}} - -{{/* Get value based on current Kubernetes version */}} -{{- define "kube-prometheus-stack.kubeVersionDefaultValue" -}} - {{- $values := index . 0 -}} - {{- $kubeVersion := index . 1 -}} - {{- $old := index . 2 -}} - {{- $new := index . 3 -}} - {{- $default := index . 4 -}} - {{- if kindIs "invalid" $default -}} - {{- if semverCompare $kubeVersion (include "kube-prometheus-stack.kubeVersion" $values) -}} - {{- print $new -}} - {{- else -}} - {{- print $old -}} - {{- end -}} - {{- else -}} - {{- print $default }} - {{- end -}} -{{- end -}} - -{{/* Get value for kube-controller-manager depending on insecure scraping availability */}} -{{- define "kube-prometheus-stack.kubeControllerManager.insecureScrape" -}} - {{- $values := index . 0 -}} - {{- $insecure := index . 1 -}} - {{- $secure := index . 2 -}} - {{- $userValue := index . 3 -}} - {{- include "kube-prometheus-stack.kubeVersionDefaultValue" (list $values ">= 1.22-0" $insecure $secure $userValue) -}} -{{- end -}} - -{{/* Get value for kube-scheduler depending on insecure scraping availability */}} -{{- define "kube-prometheus-stack.kubeScheduler.insecureScrape" -}} - {{- $values := index . 0 -}} - {{- $insecure := index . 1 -}} - {{- $secure := index . 2 -}} - {{- $userValue := index . 3 -}} - {{- include "kube-prometheus-stack.kubeVersionDefaultValue" (list $values ">= 1.23-0" $insecure $secure $userValue) -}} -{{- end -}} - -{{/* Sets default scrape limits for servicemonitor */}} -{{- define "servicemonitor.scrapeLimits" -}} -{{- with .sampleLimit }} -sampleLimit: {{ . }} -{{- end }} -{{- with .targetLimit }} -targetLimit: {{ . }} -{{- end }} -{{- with .labelLimit }} -labelLimit: {{ . }} -{{- end }} -{{- with .labelNameLengthLimit }} -labelNameLengthLimit: {{ . }} -{{- end }} -{{- with .labelValueLengthLimit }} -labelValueLengthLimit: {{ . }} -{{- end }} -{{- end -}} - -{{/* -To help compatibility with other charts which use global.imagePullSecrets. -Allow either an array of {name: pullSecret} maps (k8s-style), or an array of strings (more common helm-style). -global: - imagePullSecrets: - - name: pullSecret1 - - name: pullSecret2 - -or - -global: - imagePullSecrets: - - pullSecret1 - - pullSecret2 -*/}} -{{- define "kube-prometheus-stack.imagePullSecrets" -}} -{{- range .Values.global.imagePullSecrets }} - {{- if eq (typeOf .) "map[string]interface {}" }} -- {{ toYaml . | trim }} - {{- else }} -- name: {{ . }} - {{- end }} -{{- end }} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/alertmanager.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/alertmanager.yaml deleted file mode 100644 index 492ebbdf45..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/alertmanager.yaml +++ /dev/null @@ -1,175 +0,0 @@ -{{- if .Values.alertmanager.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: Alertmanager -metadata: - name: {{ template "kube-prometheus-stack.alertmanager.crname" . }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-alertmanager -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.alertmanager.annotations }} - annotations: -{{ toYaml .Values.alertmanager.annotations | indent 4 }} -{{- end }} -spec: -{{- if .Values.alertmanager.alertmanagerSpec.image }} - {{- $registry := include "monitoring_registry" . | default .Values.alertmanager.alertmanagerSpec.image.registry }} - {{- if and .Values.alertmanager.alertmanagerSpec.image.tag .Values.alertmanager.alertmanagerSpec.image.sha }} - image: "{{ $registry }}/{{ .Values.alertmanager.alertmanagerSpec.image.repository }}:{{ .Values.alertmanager.alertmanagerSpec.image.tag }}@sha256:{{ .Values.alertmanager.alertmanagerSpec.image.sha }}" - {{- else if .Values.alertmanager.alertmanagerSpec.image.sha }} - image: "{{ $registry }}/{{ .Values.alertmanager.alertmanagerSpec.image.repository }}@sha256:{{ .Values.alertmanager.alertmanagerSpec.image.sha }}" - {{- else if .Values.alertmanager.alertmanagerSpec.image.tag }} - image: "{{ $registry }}/{{ .Values.alertmanager.alertmanagerSpec.image.repository }}:{{ .Values.alertmanager.alertmanagerSpec.image.tag }}" - {{- else }} - image: "{{ $registry }}/{{ .Values.alertmanager.alertmanagerSpec.image.repository }}" - {{- end }} - version: {{ .Values.alertmanager.alertmanagerSpec.image.tag }} - {{- if .Values.alertmanager.alertmanagerSpec.image.sha }} - sha: {{ .Values.alertmanager.alertmanagerSpec.image.sha }} - {{- end }} -{{- end }} - replicas: {{ .Values.alertmanager.alertmanagerSpec.replicas }} - listenLocal: {{ .Values.alertmanager.alertmanagerSpec.listenLocal }} - serviceAccountName: {{ template "kube-prometheus-stack.alertmanager.serviceAccountName" . }} -{{- if .Values.alertmanager.alertmanagerSpec.externalUrl }} - externalUrl: "{{ tpl .Values.alertmanager.alertmanagerSpec.externalUrl . }}" -{{- else if and .Values.alertmanager.ingress.enabled .Values.alertmanager.ingress.hosts }} - externalUrl: "http://{{ tpl (index .Values.alertmanager.ingress.hosts 0) . }}{{ .Values.alertmanager.alertmanagerSpec.routePrefix }}" -{{- else if not (or (kindIs "invalid" .Values.global.cattle.url) (kindIs "invalid" .Values.global.cattle.clusterId)) }} - externalUrl: "{{ .Values.global.cattle.url }}/k8s/clusters/{{ .Values.global.cattle.clusterId }}/api/v1/namespaces/{{ .Values.namespaceOverride }}/services/http:{{ template "kube-prometheus-stack.fullname" . }}-alertmanager:{{ .Values.alertmanager.service.port }}/proxy" -{{- else }} - externalUrl: http://{{ template "kube-prometheus-stack.fullname" . }}-alertmanager.{{ template "kube-prometheus-stack.namespace" . }}:{{ .Values.alertmanager.service.port }} -{{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 4 }} -{{- if .Values.alertmanager.alertmanagerSpec.nodeSelector }} -{{ toYaml .Values.alertmanager.alertmanagerSpec.nodeSelector | indent 4 }} -{{- end }} - paused: {{ .Values.alertmanager.alertmanagerSpec.paused }} - logFormat: {{ .Values.alertmanager.alertmanagerSpec.logFormat | quote }} - logLevel: {{ .Values.alertmanager.alertmanagerSpec.logLevel | quote }} - retention: {{ .Values.alertmanager.alertmanagerSpec.retention | quote }} -{{- if .Values.alertmanager.alertmanagerSpec.secrets }} - secrets: -{{ toYaml .Values.alertmanager.alertmanagerSpec.secrets | indent 4 }} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.configSecret }} - configSecret: {{ .Values.alertmanager.alertmanagerSpec.configSecret }} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.configMaps }} - configMaps: -{{ toYaml .Values.alertmanager.alertmanagerSpec.configMaps | indent 4 }} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.alertmanagerConfigSelector }} - alertmanagerConfigSelector: -{{ toYaml .Values.alertmanager.alertmanagerSpec.alertmanagerConfigSelector | indent 4}} -{{ else }} - alertmanagerConfigSelector: {} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.alertmanagerConfigNamespaceSelector }} - alertmanagerConfigNamespaceSelector: -{{ toYaml .Values.alertmanager.alertmanagerSpec.alertmanagerConfigNamespaceSelector | indent 4}} -{{ else }} - alertmanagerConfigNamespaceSelector: {} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.web }} - web: -{{ toYaml .Values.alertmanager.alertmanagerSpec.web | indent 4 }} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.alertmanagerConfiguration }} - alertmanagerConfiguration: -{{ toYaml .Values.alertmanager.alertmanagerSpec.alertmanagerConfiguration | indent 4 }} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.alertmanagerConfigMatcherStrategy }} - alertmanagerConfigMatcherStrategy: -{{ toYaml .Values.alertmanager.alertmanagerSpec.alertmanagerConfigMatcherStrategy | indent 4 }} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.resources }} - resources: -{{ toYaml .Values.alertmanager.alertmanagerSpec.resources | indent 4 }} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.routePrefix }} - routePrefix: "{{ .Values.alertmanager.alertmanagerSpec.routePrefix }}" -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.securityContext }} - securityContext: -{{ toYaml .Values.alertmanager.alertmanagerSpec.securityContext | indent 4 }} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.storage }} - storage: -{{ tpl (toYaml .Values.alertmanager.alertmanagerSpec.storage | indent 4) . }} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.podMetadata }} - podMetadata: -{{ toYaml .Values.alertmanager.alertmanagerSpec.podMetadata | indent 4 }} -{{- end }} -{{- if or .Values.alertmanager.alertmanagerSpec.podAntiAffinity .Values.alertmanager.alertmanagerSpec.affinity }} - affinity: -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.affinity }} -{{ toYaml .Values.alertmanager.alertmanagerSpec.affinity | indent 4 }} -{{- end }} -{{- if eq .Values.alertmanager.alertmanagerSpec.podAntiAffinity "hard" }} - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - topologyKey: {{ .Values.alertmanager.alertmanagerSpec.podAntiAffinityTopologyKey }} - labelSelector: - matchExpressions: - - {key: app.kubernetes.io/name, operator: In, values: [alertmanager]} - - {key: alertmanager, operator: In, values: [{{ template "kube-prometheus-stack.alertmanager.crname" . }}]} -{{- else if eq .Values.alertmanager.alertmanagerSpec.podAntiAffinity "soft" }} - podAntiAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - weight: 100 - podAffinityTerm: - topologyKey: {{ .Values.alertmanager.alertmanagerSpec.podAntiAffinityTopologyKey }} - labelSelector: - matchExpressions: - - {key: app.kubernetes.io/name, operator: In, values: [alertmanager]} - - {key: alertmanager, operator: In, values: [{{ template "kube-prometheus-stack.alertmanager.crname" . }}]} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 4 }} -{{- if .Values.alertmanager.alertmanagerSpec.tolerations }} -{{ toYaml .Values.alertmanager.alertmanagerSpec.tolerations | indent 4 }} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.topologySpreadConstraints }} - topologySpreadConstraints: -{{ toYaml .Values.alertmanager.alertmanagerSpec.topologySpreadConstraints | indent 4 }} -{{- end }} -{{- if .Values.global.imagePullSecrets }} - imagePullSecrets: -{{ include "kube-prometheus-stack.imagePullSecrets" . | trim | indent 4 }} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.containers }} - containers: -{{ toYaml .Values.alertmanager.alertmanagerSpec.containers | indent 4 }} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.initContainers }} - initContainers: -{{ toYaml .Values.alertmanager.alertmanagerSpec.initContainers | indent 4 }} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.priorityClassName }} - priorityClassName: {{.Values.alertmanager.alertmanagerSpec.priorityClassName }} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.additionalPeers }} - additionalPeers: -{{ toYaml .Values.alertmanager.alertmanagerSpec.additionalPeers | indent 4 }} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.volumes }} - volumes: -{{ toYaml .Values.alertmanager.alertmanagerSpec.volumes | indent 4 }} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.volumeMounts }} - volumeMounts: -{{ toYaml .Values.alertmanager.alertmanagerSpec.volumeMounts | indent 4 }} -{{- end }} - portName: {{ .Values.alertmanager.alertmanagerSpec.portName }} -{{- if .Values.alertmanager.alertmanagerSpec.clusterAdvertiseAddress }} - clusterAdvertiseAddress: {{ .Values.alertmanager.alertmanagerSpec.clusterAdvertiseAddress }} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.forceEnableClusterMode }} - forceEnableClusterMode: {{ .Values.alertmanager.alertmanagerSpec.forceEnableClusterMode }} -{{- end }} -{{- if .Values.alertmanager.alertmanagerSpec.minReadySeconds }} - minReadySeconds: {{ .Values.alertmanager.alertmanagerSpec.minReadySeconds }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/extrasecret.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/extrasecret.yaml deleted file mode 100644 index ecd8f47021..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/extrasecret.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.alertmanager.extraSecret.data -}} -{{- $secretName := printf "alertmanager-%s-extra" (include "kube-prometheus-stack.fullname" . ) -}} -apiVersion: v1 -kind: Secret -metadata: - name: {{ default $secretName .Values.alertmanager.extraSecret.name }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} -{{- if .Values.alertmanager.extraSecret.annotations }} - annotations: -{{ toYaml .Values.alertmanager.extraSecret.annotations | indent 4 }} -{{- end }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-alertmanager - app.kubernetes.io/component: alertmanager -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -data: -{{- range $key, $val := .Values.alertmanager.extraSecret.data }} - {{ $key }}: {{ $val | b64enc | quote }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/ingress.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/ingress.yaml deleted file mode 100644 index ae8092dec5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/ingress.yaml +++ /dev/null @@ -1,78 +0,0 @@ -{{- if and .Values.alertmanager.enabled .Values.alertmanager.ingress.enabled }} -{{- $pathType := .Values.alertmanager.ingress.pathType | default "ImplementationSpecific" }} -{{- $serviceName := printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "alertmanager" }} -{{- $backendServiceName := .Values.alertmanager.ingress.serviceName | default (printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "alertmanager") }} -{{- $servicePort := .Values.alertmanager.ingress.servicePort | default .Values.alertmanager.service.port -}} -{{- $routePrefix := list .Values.alertmanager.alertmanagerSpec.routePrefix }} -{{- $paths := .Values.alertmanager.ingress.paths | default $routePrefix -}} -{{- $apiIsStable := eq (include "kube-prometheus-stack.ingress.isStable" .) "true" -}} -{{- $ingressSupportsPathType := eq (include "kube-prometheus-stack.ingress.supportsPathType" .) "true" -}} -apiVersion: {{ include "kube-prometheus-stack.ingress.apiVersion" . }} -kind: Ingress -metadata: - name: {{ $serviceName }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} -{{- if .Values.alertmanager.ingress.annotations }} - annotations: -{{ toYaml .Values.alertmanager.ingress.annotations | indent 4 }} -{{- end }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-alertmanager -{{- if .Values.alertmanager.ingress.labels }} -{{ toYaml .Values.alertmanager.ingress.labels | indent 4 }} -{{- end }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - {{- if $apiIsStable }} - {{- if .Values.alertmanager.ingress.ingressClassName }} - ingressClassName: {{ .Values.alertmanager.ingress.ingressClassName }} - {{- end }} - {{- end }} - rules: - {{- if .Values.alertmanager.ingress.hosts }} - {{- range $host := .Values.alertmanager.ingress.hosts }} - - host: {{ tpl $host $ }} - http: - paths: - {{- range $p := $paths }} - - path: {{ tpl $p $ }} - {{- if and $pathType $ingressSupportsPathType }} - pathType: {{ $pathType }} - {{- end }} - backend: - {{- if $apiIsStable }} - service: - name: {{ $backendServiceName }} - port: - number: {{ $servicePort }} - {{- else }} - serviceName: {{ $backendServiceName }} - servicePort: {{ $servicePort }} - {{- end }} - {{- end -}} - {{- end -}} - {{- else }} - - http: - paths: - {{- range $p := $paths }} - - path: {{ tpl $p $ }} - {{- if and $pathType $ingressSupportsPathType }} - pathType: {{ $pathType }} - {{- end }} - backend: - {{- if $apiIsStable }} - service: - name: {{ $backendServiceName }} - port: - number: {{ $servicePort }} - {{- else }} - serviceName: {{ $backendServiceName }} - servicePort: {{ $servicePort }} - {{- end }} - {{- end -}} - {{- end -}} - {{- if .Values.alertmanager.ingress.tls }} - tls: -{{ tpl (toYaml .Values.alertmanager.ingress.tls | indent 4) . }} - {{- end -}} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/ingressperreplica.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/ingressperreplica.yaml deleted file mode 100644 index f21bf96169..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/ingressperreplica.yaml +++ /dev/null @@ -1,67 +0,0 @@ -{{- if and .Values.alertmanager.enabled .Values.alertmanager.servicePerReplica.enabled .Values.alertmanager.ingressPerReplica.enabled }} -{{- $pathType := .Values.alertmanager.ingressPerReplica.pathType | default "" }} -{{- $count := .Values.alertmanager.alertmanagerSpec.replicas | int -}} -{{- $servicePort := .Values.alertmanager.service.port -}} -{{- $ingressValues := .Values.alertmanager.ingressPerReplica -}} -{{- $apiIsStable := eq (include "kube-prometheus-stack.ingress.isStable" .) "true" -}} -{{- $ingressSupportsPathType := eq (include "kube-prometheus-stack.ingress.supportsPathType" .) "true" -}} -apiVersion: v1 -kind: List -metadata: - name: {{ include "kube-prometheus-stack.fullname" $ }}-alertmanager-ingressperreplica - namespace: {{ template "kube-prometheus-stack.namespace" . }} -items: -{{ range $i, $e := until $count }} - - kind: Ingress - apiVersion: {{ include "kube-prometheus-stack.ingress.apiVersion" $ }} - metadata: - name: {{ include "kube-prometheus-stack.fullname" $ }}-alertmanager-{{ $i }} - namespace: {{ template "kube-prometheus-stack.namespace" $ }} - labels: - app: {{ include "kube-prometheus-stack.name" $ }}-alertmanager - {{ include "kube-prometheus-stack.labels" $ | indent 8 }} - {{- if $ingressValues.labels }} -{{ toYaml $ingressValues.labels | indent 8 }} - {{- end }} - {{- if $ingressValues.annotations }} - annotations: -{{ toYaml $ingressValues.annotations | indent 8 }} - {{- end }} - spec: - {{- if $apiIsStable }} - {{- if $ingressValues.ingressClassName }} - ingressClassName: {{ $ingressValues.ingressClassName }} - {{- end }} - {{- end }} - rules: - - host: {{ $ingressValues.hostPrefix }}-{{ $i }}.{{ $ingressValues.hostDomain }} - http: - paths: - {{- range $p := $ingressValues.paths }} - - path: {{ tpl $p $ }} - {{- if and $pathType $ingressSupportsPathType }} - pathType: {{ $pathType }} - {{- end }} - backend: - {{- if $apiIsStable }} - service: - name: {{ include "kube-prometheus-stack.fullname" $ }}-alertmanager-{{ $i }} - port: - number: {{ $servicePort }} - {{- else }} - serviceName: {{ include "kube-prometheus-stack.fullname" $ }}-alertmanager-{{ $i }} - servicePort: {{ $servicePort }} - {{- end }} - {{- end -}} - {{- if or $ingressValues.tlsSecretName $ingressValues.tlsSecretPerReplica.enabled }} - tls: - - hosts: - - {{ $ingressValues.hostPrefix }}-{{ $i }}.{{ $ingressValues.hostDomain }} - {{- if $ingressValues.tlsSecretPerReplica.enabled }} - secretName: {{ $ingressValues.tlsSecretPerReplica.prefix }}-{{ $i }} - {{- else }} - secretName: {{ $ingressValues.tlsSecretName }} - {{- end }} - {{- end }} -{{- end -}} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/podDisruptionBudget.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/podDisruptionBudget.yaml deleted file mode 100644 index b183403125..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/podDisruptionBudget.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if and .Values.alertmanager.enabled .Values.alertmanager.podDisruptionBudget.enabled }} -apiVersion: {{ include "kube-prometheus-stack.pdb.apiVersion" . }} -kind: PodDisruptionBudget -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-alertmanager - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-alertmanager -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - {{- if .Values.alertmanager.podDisruptionBudget.minAvailable }} - minAvailable: {{ .Values.alertmanager.podDisruptionBudget.minAvailable }} - {{- end }} - {{- if .Values.alertmanager.podDisruptionBudget.maxUnavailable }} - maxUnavailable: {{ .Values.alertmanager.podDisruptionBudget.maxUnavailable }} - {{- end }} - selector: - matchLabels: - app.kubernetes.io/name: alertmanager - alertmanager: {{ template "kube-prometheus-stack.alertmanager.crname" . }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/psp-role.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/psp-role.yaml deleted file mode 100644 index 8810e93ded..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/psp-role.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if and .Values.alertmanager.enabled (or .Values.global.cattle.psp.enabled (and .Values.global.rbac.create .Values.global.rbac.pspEnabled)) }} -{{- if .Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy" }} -kind: Role -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-alertmanager - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-alertmanager -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -rules: -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if semverCompare "> 1.15.0-0" $kubeTargetVersion }} -- apiGroups: ['policy'] -{{- else }} -- apiGroups: ['extensions'] -{{- end }} - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "kube-prometheus-stack.fullname" . }}-alertmanager -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/psp-rolebinding.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/psp-rolebinding.yaml deleted file mode 100644 index 794f4ad178..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/psp-rolebinding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if and .Values.alertmanager.enabled (or .Values.global.cattle.psp.enabled (and .Values.global.rbac.create .Values.global.rbac.pspEnabled)) }} -{{- if .Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy" }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-alertmanager - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-alertmanager -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "kube-prometheus-stack.fullname" . }}-alertmanager -subjects: - - kind: ServiceAccount - name: {{ template "kube-prometheus-stack.alertmanager.serviceAccountName" . }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/psp.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/psp.yaml deleted file mode 100644 index 07b616b5cb..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/psp.yaml +++ /dev/null @@ -1,47 +0,0 @@ -{{- if and .Values.alertmanager.enabled (or .Values.global.cattle.psp.enabled (and .Values.global.rbac.create .Values.global.rbac.pspEnabled)) }} -{{- if .Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy" }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-alertmanager - labels: - app: {{ template "kube-prometheus-stack.name" . }}-alertmanager -{{- if .Values.global.rbac.pspAnnotations }} - annotations: -{{ toYaml .Values.global.rbac.pspAnnotations | indent 4 }} -{{- end }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - privileged: false - # Allow core volume types. - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'secret' - - 'downwardAPI' - - 'persistentVolumeClaim' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - # Permits the container to run with root privileges as well. - rule: 'RunAsAny' - seLinux: - # This policy assumes the nodes are using AppArmor rather than SELinux. - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - # Allow adding the root group. - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - # Allow adding the root group. - - min: 0 - max: 65535 - readOnlyRootFilesystem: false -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/secret.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/secret.yaml deleted file mode 100644 index 9ddcbef362..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/secret.yaml +++ /dev/null @@ -1,35 +0,0 @@ -{{- if and (.Values.alertmanager.enabled) (not .Values.alertmanager.alertmanagerSpec.useExistingSecret) }} -{{/* This file is applied when the operation is helm install and the target secret does not exist. */}} -{{- $secretName := (printf "alertmanager-%s" (include "kube-prometheus-stack.alertmanager.crname" .)) }} -{{- if (not (lookup "v1" "Secret" (include "kube-prometheus-stack.namespace" .) $secretName)) }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ $secretName }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - annotations: - "helm.sh/hook": pre-install, pre-upgrade - "helm.sh/hook-weight": "3" - "helm.sh/resource-policy": keep -{{- if .Values.alertmanager.secret.annotations }} -{{ toYaml .Values.alertmanager.secret.annotations | indent 4 }} -{{- end }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-alertmanager -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -data: -{{- if .Values.alertmanager.tplConfig }} -{{- if .Values.alertmanager.stringConfig }} - alertmanager.yaml: {{ tpl (.Values.alertmanager.stringConfig) . | b64enc | quote }} -{{- else if eq (typeOf .Values.alertmanager.config) "string" }} - alertmanager.yaml: {{ tpl (.Values.alertmanager.config) . | b64enc | quote }} -{{- else }} - alertmanager.yaml: {{ tpl (toYaml .Values.alertmanager.config) . | b64enc | quote }} -{{- end }} -{{- else }} - alertmanager.yaml: {{ toYaml .Values.alertmanager.config | b64enc | quote }} -{{- end }} -{{- range $key, $val := .Values.alertmanager.templateFiles }} - {{ $key }}: {{ $val | b64enc | quote }} -{{- end }} -{{- end }}{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/service.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/service.yaml deleted file mode 100644 index 3021336e0e..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/service.yaml +++ /dev/null @@ -1,56 +0,0 @@ -{{- if .Values.alertmanager.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-alertmanager - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-alertmanager - self-monitor: {{ .Values.alertmanager.serviceMonitor.selfMonitor | quote }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.alertmanager.service.labels }} -{{ toYaml .Values.alertmanager.service.labels | indent 4 }} -{{- end }} -{{- if .Values.alertmanager.service.annotations }} - annotations: -{{ toYaml .Values.alertmanager.service.annotations | indent 4 }} -{{- end }} -spec: -{{- if .Values.alertmanager.service.clusterIP }} - clusterIP: {{ .Values.alertmanager.service.clusterIP }} -{{- end }} -{{- if .Values.alertmanager.service.externalIPs }} - externalIPs: -{{ toYaml .Values.alertmanager.service.externalIPs | indent 4 }} -{{- end }} -{{- if .Values.alertmanager.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.alertmanager.service.loadBalancerIP }} -{{- end }} -{{- if .Values.alertmanager.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- range $cidr := .Values.alertmanager.service.loadBalancerSourceRanges }} - - {{ $cidr }} - {{- end }} -{{- end }} -{{- if ne .Values.alertmanager.service.type "ClusterIP" }} - externalTrafficPolicy: {{ .Values.alertmanager.service.externalTrafficPolicy }} -{{- end }} - ports: - - name: {{ .Values.alertmanager.alertmanagerSpec.portName }} - {{- if eq .Values.alertmanager.service.type "NodePort" }} - nodePort: {{ .Values.alertmanager.service.nodePort }} - {{- end }} - port: {{ .Values.alertmanager.service.port }} - targetPort: {{ .Values.alertmanager.service.targetPort }} - protocol: TCP -{{- if .Values.alertmanager.service.additionalPorts }} -{{ toYaml .Values.alertmanager.service.additionalPorts | indent 2 }} -{{- end }} - selector: - app.kubernetes.io/name: alertmanager - alertmanager: {{ template "kube-prometheus-stack.alertmanager.crname" . }} -{{- if .Values.alertmanager.service.sessionAffinity }} - sessionAffinity: {{ .Values.alertmanager.service.sessionAffinity }} -{{- end }} - type: "{{ .Values.alertmanager.service.type }}" -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/serviceaccount.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/serviceaccount.yaml deleted file mode 100644 index 745ced8bde..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/serviceaccount.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if and .Values.alertmanager.enabled .Values.alertmanager.serviceAccount.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "kube-prometheus-stack.alertmanager.serviceAccountName" . }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-alertmanager - app.kubernetes.io/name: {{ template "kube-prometheus-stack.name" . }}-alertmanager - app.kubernetes.io/component: alertmanager -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.alertmanager.serviceAccount.annotations }} - annotations: -{{ toYaml .Values.alertmanager.serviceAccount.annotations | indent 4 }} -{{- end }} -automountServiceAccountToken: {{ .Values.alertmanager.serviceAccount.automountServiceAccountToken }} -{{- if .Values.global.imagePullSecrets }} -imagePullSecrets: -{{ include "kube-prometheus-stack.imagePullSecrets" . | trim | indent 2}} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/servicemonitor.yaml deleted file mode 100644 index 2eaa80ccce..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/servicemonitor.yaml +++ /dev/null @@ -1,60 +0,0 @@ -{{- if and .Values.alertmanager.enabled .Values.alertmanager.serviceMonitor.selfMonitor }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-alertmanager - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-alertmanager -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- with .Values.alertmanager.serviceMonitor.additionalLabels }} -{{- toYaml . | nindent 4 }} -{{- end }} -spec: - {{- include "servicemonitor.scrapeLimits" .Values.alertmanager.serviceMonitor | nindent 2 }} - selector: - matchLabels: - app: {{ template "kube-prometheus-stack.name" . }}-alertmanager - release: {{ $.Release.Name | quote }} - self-monitor: "true" - namespaceSelector: - matchNames: - - {{ printf "%s" (include "kube-prometheus-stack.namespace" .) | quote }} - endpoints: - - port: {{ .Values.alertmanager.alertmanagerSpec.portName }} - enableHttp2: {{ .Values.alertmanager.serviceMonitor.enableHttp2 }} - {{- if .Values.alertmanager.serviceMonitor.interval }} - interval: {{ .Values.alertmanager.serviceMonitor.interval }} - {{- end }} - {{- if .Values.alertmanager.serviceMonitor.proxyUrl }} - proxyUrl: {{ .Values.alertmanager.serviceMonitor.proxyUrl}} - {{- end }} - {{- if .Values.alertmanager.serviceMonitor.scheme }} - scheme: {{ .Values.alertmanager.serviceMonitor.scheme }} - {{- end }} - {{- if .Values.alertmanager.serviceMonitor.bearerTokenFile }} - bearerTokenFile: {{ .Values.alertmanager.serviceMonitor.bearerTokenFile }} - {{- end }} - {{- if .Values.alertmanager.serviceMonitor.tlsConfig }} - tlsConfig: {{ toYaml .Values.alertmanager.serviceMonitor.tlsConfig | nindent 6 }} - {{- end }} - path: "{{ trimSuffix "/" .Values.alertmanager.alertmanagerSpec.routePrefix }}/metrics" - metricRelabelings: - {{- if .Values.alertmanager.serviceMonitor.metricRelabelings }} - {{ tpl (toYaml .Values.alertmanager.serviceMonitor.metricRelabelings | indent 6) . }} - {{- end }} - {{ if .Values.global.cattle.clusterId }} - - sourceLabels: [__address__] - targetLabel: cluster_id - replacement: {{ .Values.global.cattle.clusterId }} - {{- end }} - {{ if .Values.global.cattle.clusterName }} - - sourceLabels: [__address__] - targetLabel: cluster_name - replacement: {{ .Values.global.cattle.clusterName }} - {{- end }} -{{- if .Values.alertmanager.serviceMonitor.relabelings }} - relabelings: -{{ toYaml .Values.alertmanager.serviceMonitor.relabelings | indent 6 }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/serviceperreplica.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/serviceperreplica.yaml deleted file mode 100644 index 75a13bdf97..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/alertmanager/serviceperreplica.yaml +++ /dev/null @@ -1,49 +0,0 @@ -{{- if and .Values.alertmanager.enabled .Values.alertmanager.servicePerReplica.enabled }} -{{- $count := .Values.alertmanager.alertmanagerSpec.replicas | int -}} -{{- $serviceValues := .Values.alertmanager.servicePerReplica -}} -apiVersion: v1 -kind: List -metadata: - name: {{ include "kube-prometheus-stack.fullname" $ }}-alertmanager-serviceperreplica - namespace: {{ template "kube-prometheus-stack.namespace" . }} -items: -{{- range $i, $e := until $count }} - - apiVersion: v1 - kind: Service - metadata: - name: {{ include "kube-prometheus-stack.fullname" $ }}-alertmanager-{{ $i }} - namespace: {{ template "kube-prometheus-stack.namespace" $ }} - labels: - app: {{ include "kube-prometheus-stack.name" $ }}-alertmanager -{{ include "kube-prometheus-stack.labels" $ | indent 8 }} - {{- if $serviceValues.annotations }} - annotations: -{{ toYaml $serviceValues.annotations | indent 8 }} - {{- end }} - spec: - {{- if $serviceValues.clusterIP }} - clusterIP: {{ $serviceValues.clusterIP }} - {{- end }} - {{- if $serviceValues.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- range $cidr := $serviceValues.loadBalancerSourceRanges }} - - {{ $cidr }} - {{- end }} - {{- end }} - {{- if ne $serviceValues.type "ClusterIP" }} - externalTrafficPolicy: {{ $serviceValues.externalTrafficPolicy }} - {{- end }} - ports: - - name: {{ $.Values.alertmanager.alertmanagerSpec.portName }} - {{- if eq $serviceValues.type "NodePort" }} - nodePort: {{ $serviceValues.nodePort }} - {{- end }} - port: {{ $serviceValues.port }} - targetPort: {{ $serviceValues.targetPort }} - selector: - app.kubernetes.io/name: alertmanager - alertmanager: {{ template "kube-prometheus-stack.alertmanager.crname" $ }} - statefulset.kubernetes.io/pod-name: alertmanager-{{ include "kube-prometheus-stack.alertmanager.crname" $ }}-{{ $i }} - type: "{{ $serviceValues.type }}" -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/core-dns/service.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/core-dns/service.yaml deleted file mode 100644 index 49fbc673ee..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/core-dns/service.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- if and .Values.coreDns.enabled .Values.kubernetesServiceMonitors.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-coredns - labels: - app: {{ template "kube-prometheus-stack.name" . }}-coredns - jobLabel: coredns -{{ include "kube-prometheus-stack.labels" . | indent 4 }} - namespace: kube-system -spec: - clusterIP: None - ports: - - name: http-metrics - port: {{ .Values.coreDns.service.port }} - protocol: TCP - targetPort: {{ .Values.coreDns.service.targetPort }} - selector: - {{- if .Values.coreDns.service.selector }} -{{ toYaml .Values.coreDns.service.selector | indent 4 }} - {{- else}} - k8s-app: kube-dns - {{- end}} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/core-dns/servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/core-dns/servicemonitor.yaml deleted file mode 100644 index d3b233e343..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/core-dns/servicemonitor.yaml +++ /dev/null @@ -1,50 +0,0 @@ -{{- if and .Values.coreDns.enabled .Values.kubernetesServiceMonitors.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-coredns - namespace: "kube-system" - labels: - app: {{ template "kube-prometheus-stack.name" . }}-coredns - {{- with .Values.coreDns.serviceMonitor.additionalLabels }} - {{- toYaml . | nindent 4 }} - {{- end }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - jobLabel: jobLabel - {{- include "servicemonitor.scrapeLimits" .Values.coreDns.serviceMonitor | nindent 2 }} - selector: - matchLabels: - app: {{ template "kube-prometheus-stack.name" . }}-coredns - release: {{ $.Release.Name | quote }} - namespaceSelector: - matchNames: - - "kube-system" - endpoints: - - port: http-metrics - {{- if .Values.coreDns.serviceMonitor.interval}} - interval: {{ .Values.coreDns.serviceMonitor.interval }} - {{- end }} - {{- if .Values.coreDns.serviceMonitor.proxyUrl }} - proxyUrl: {{ .Values.coreDns.serviceMonitor.proxyUrl}} - {{- end }} - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token - metricRelabelings: - {{- if .Values.coreDns.serviceMonitor.metricRelabelings }} - {{ tpl (toYaml .Values.coreDns.serviceMonitor.metricRelabelings | indent 4) . }} - {{- end }} - {{ if .Values.global.cattle.clusterId }} - - sourceLabels: [__address__] - targetLabel: cluster_id - replacement: {{ .Values.global.cattle.clusterId }} - {{- end }} - {{ if .Values.global.cattle.clusterName }} - - sourceLabels: [__address__] - targetLabel: cluster_name - replacement: {{ .Values.global.cattle.clusterName }} - {{- end }} -{{- if .Values.coreDns.serviceMonitor.relabelings }} - relabelings: -{{ tpl (toYaml .Values.coreDns.serviceMonitor.relabelings | indent 4) . }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-api-server/servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-api-server/servicemonitor.yaml deleted file mode 100644 index 20c49853d2..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-api-server/servicemonitor.yaml +++ /dev/null @@ -1,53 +0,0 @@ -{{- if and .Values.kubeApiServer.enabled .Values.kubernetesServiceMonitors.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-apiserver - namespace: default - labels: - app: {{ template "kube-prometheus-stack.name" . }}-apiserver - {{- with .Values.kubeApiServer.serviceMonitor.additionalLabels }} - {{- toYaml . | nindent 4 }} - {{- end }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - {{- include "servicemonitor.scrapeLimits" .Values.kubeApiServer.serviceMonitor | nindent 2 }} - endpoints: - - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token - {{- if .Values.kubeApiServer.serviceMonitor.interval }} - interval: {{ .Values.kubeApiServer.serviceMonitor.interval }} - {{- end }} - {{- if .Values.kubeApiServer.serviceMonitor.proxyUrl }} - proxyUrl: {{ .Values.kubeApiServer.serviceMonitor.proxyUrl }} - {{- end }} - port: https - scheme: https - metricRelabelings: - {{- if .Values.kubeApiServer.serviceMonitor.metricRelabelings }} -{{ tpl (toYaml .Values.kubeApiServer.serviceMonitor.metricRelabelings | indent 6) . }} - {{- end }} - {{ if .Values.global.cattle.clusterId }} - - sourceLabels: [__address__] - targetLabel: cluster_id - replacement: {{ .Values.global.cattle.clusterId }} - {{- end }} - {{ if .Values.global.cattle.clusterName}} - - sourceLabels: [__address__] - targetLabel: cluster_name - replacement: {{ .Values.global.cattle.clusterName }} - {{- end }} -{{- if .Values.kubeApiServer.serviceMonitor.relabelings }} - relabelings: -{{ tpl (toYaml .Values.kubeApiServer.serviceMonitor.relabelings | indent 6) . }} -{{- end }} - tlsConfig: - caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - serverName: {{ .Values.kubeApiServer.tlsConfig.serverName }} - insecureSkipVerify: {{ .Values.kubeApiServer.tlsConfig.insecureSkipVerify }} - jobLabel: {{ .Values.kubeApiServer.serviceMonitor.jobLabel }} - namespaceSelector: - matchNames: - - default - selector: -{{ toYaml .Values.kubeApiServer.serviceMonitor.selector | indent 4 }} -{{- end}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-controller-manager/endpoints.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-controller-manager/endpoints.yaml deleted file mode 100644 index 43094d6a63..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-controller-manager/endpoints.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- if and .Values.kubeControllerManager.enabled .Values.kubeControllerManager.endpoints .Values.kubernetesServiceMonitors.enabled }} -apiVersion: v1 -kind: Endpoints -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-kube-controller-manager - labels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-controller-manager - k8s-app: kube-controller-manager -{{ include "kube-prometheus-stack.labels" . | indent 4 }} - namespace: kube-system -subsets: - - addresses: - {{- range .Values.kubeControllerManager.endpoints }} - - ip: {{ . }} - {{- end }} - ports: - - name: http-metrics - {{- $kubeControllerManagerDefaultInsecurePort := 10252 }} - {{- $kubeControllerManagerDefaultSecurePort := 10257 }} - port: {{ include "kube-prometheus-stack.kubeControllerManager.insecureScrape" (list . $kubeControllerManagerDefaultInsecurePort $kubeControllerManagerDefaultSecurePort .Values.kubeControllerManager.service.port) }} - protocol: TCP -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-controller-manager/service.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-controller-manager/service.yaml deleted file mode 100644 index 894c983e10..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-controller-manager/service.yaml +++ /dev/null @@ -1,29 +0,0 @@ -{{- if and .Values.kubeControllerManager.enabled .Values.kubeControllerManager.service.enabled .Values.kubernetesServiceMonitors.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-kube-controller-manager - labels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-controller-manager - jobLabel: kube-controller-manager -{{ include "kube-prometheus-stack.labels" . | indent 4 }} - namespace: kube-system -spec: - clusterIP: None - ports: - - name: http-metrics - {{- $kubeControllerManagerDefaultInsecurePort := 10252 }} - {{- $kubeControllerManagerDefaultSecurePort := 10257 }} - port: {{ include "kube-prometheus-stack.kubeControllerManager.insecureScrape" (list . $kubeControllerManagerDefaultInsecurePort $kubeControllerManagerDefaultSecurePort .Values.kubeControllerManager.service.port) }} - protocol: TCP - targetPort: {{ include "kube-prometheus-stack.kubeControllerManager.insecureScrape" (list . $kubeControllerManagerDefaultInsecurePort $kubeControllerManagerDefaultSecurePort .Values.kubeControllerManager.service.targetPort) }} -{{- if .Values.kubeControllerManager.endpoints }}{{- else }} - selector: - {{- if .Values.kubeControllerManager.service.selector }} -{{ toYaml .Values.kubeControllerManager.service.selector | indent 4 }} - {{- else}} - component: kube-controller-manager - {{- end}} -{{- end }} - type: ClusterIP -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-controller-manager/servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-controller-manager/servicemonitor.yaml deleted file mode 100644 index 4ec0386a22..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-controller-manager/servicemonitor.yaml +++ /dev/null @@ -1,61 +0,0 @@ -{{- if and .Values.kubeControllerManager.enabled .Values.kubeControllerManager.serviceMonitor.enabled .Values.kubernetesServiceMonitors.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-kube-controller-manager - namespace: "kube-system" - labels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-controller-manager - {{- with .Values.kubeControllerManager.serviceMonitor.additionalLabels }} - {{- toYaml . | nindent 4 }} - {{- end }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - jobLabel: jobLabel - {{- include "servicemonitor.scrapeLimits" .Values.kubeControllerManager.serviceMonitor | nindent 2 }} - selector: - matchLabels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-controller-manager - release: {{ $.Release.Name | quote }} - namespaceSelector: - matchNames: - - "kube-system" - endpoints: - - port: http-metrics - {{- if .Values.kubeControllerManager.serviceMonitor.interval }} - interval: {{ .Values.kubeControllerManager.serviceMonitor.interval }} - {{- end }} - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token - {{- if .Values.kubeControllerManager.serviceMonitor.proxyUrl }} - proxyUrl: {{ .Values.kubeControllerManager.serviceMonitor.proxyUrl}} - {{- end }} - {{- if eq (include "kube-prometheus-stack.kubeControllerManager.insecureScrape" (list . false true .Values.kubeControllerManager.serviceMonitor.https )) "true" }} - scheme: https - tlsConfig: - caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - {{- if eq (include "kube-prometheus-stack.kubeControllerManager.insecureScrape" (list . nil true .Values.kubeControllerManager.serviceMonitor.insecureSkipVerify)) "true" }} - insecureSkipVerify: true - {{- end }} - {{- if .Values.kubeControllerManager.serviceMonitor.serverName }} - serverName: {{ .Values.kubeControllerManager.serviceMonitor.serverName }} - {{- end }} - {{- end }} - metricRelabelings: - {{- if.Values.kubeControllerManager.serviceMonitor.metricRelabelings }} - {{ tpl (toYaml .Values.kubeControllerManager.serviceMonitor.metricRelabelings | indent 4) . }} - {{- end }} - {{ if .Values.global.cattle.clusterId }} - - sourceLabels: [__address__] - targetLabel: cluster_id - replacement: {{ .Values.global.cattle.clusterId }} - {{- end }} - {{ if .Values.global.cattle.clusterName}} - - sourceLabels: [__address__] - targetLabel: cluster_name - replacement: {{ .Values.global.cattle.clusterName }} - {{- end }} -{{- if .Values.kubeControllerManager.serviceMonitor.relabelings }} - relabelings: -{{ tpl (toYaml .Values.kubeControllerManager.serviceMonitor.relabelings | indent 4) . }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-dns/service.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-dns/service.yaml deleted file mode 100644 index 81b2c9930c..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-dns/service.yaml +++ /dev/null @@ -1,28 +0,0 @@ -{{- if and .Values.kubeDns.enabled .Values.kubernetesServiceMonitors.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-kube-dns - labels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-dns - jobLabel: kube-dns -{{ include "kube-prometheus-stack.labels" . | indent 4 }} - namespace: kube-system -spec: - clusterIP: None - ports: - - name: http-metrics-dnsmasq - port: {{ .Values.kubeDns.service.dnsmasq.port }} - protocol: TCP - targetPort: {{ .Values.kubeDns.service.dnsmasq.targetPort }} - - name: http-metrics-skydns - port: {{ .Values.kubeDns.service.skydns.port }} - protocol: TCP - targetPort: {{ .Values.kubeDns.service.skydns.targetPort }} - selector: - {{- if .Values.kubeDns.service.selector }} -{{ toYaml .Values.kubeDns.service.selector | indent 4 }} - {{- else}} - k8s-app: kube-dns - {{- end}} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-dns/servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-dns/servicemonitor.yaml deleted file mode 100644 index 3465c57467..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-dns/servicemonitor.yaml +++ /dev/null @@ -1,63 +0,0 @@ -{{- if and .Values.kubeDns.enabled .Values.kubernetesServiceMonitors.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-kube-dns - namespace: "kube-system" - labels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-dns - {{- with .Values.kubeDns.serviceMonitor.additionalLabels }} - {{- toYaml . | nindent 4 }} - {{- end }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - jobLabel: jobLabel - {{- include "servicemonitor.scrapeLimits" .Values.kubeDns.serviceMonitor | nindent 2 }} - selector: - matchLabels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-dns - release: {{ $.Release.Name | quote }} - namespaceSelector: - matchNames: - - "kube-system" - endpoints: - - port: http-metrics-dnsmasq - {{- if .Values.kubeDns.serviceMonitor.interval }} - interval: {{ .Values.kubeDns.serviceMonitor.interval }} - {{- end }} - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token - {{- if .Values.kubeDns.serviceMonitor.proxyUrl }} - proxyUrl: {{ .Values.kubeDns.serviceMonitor.proxyUrl}} - {{- end }} - metricRelabelings: - {{- if .Values.kubeDns.serviceMonitor.dnsmasqMetricRelabelings }} - {{ tpl (toYaml .Values.kubeDns.serviceMonitor.dnsmasqMetricRelabelings | indent 4) . }} - {{- end }} - {{ if .Values.global.cattle.clusterId }} - - sourceLabels: [__address__] - targetLabel: cluster_id - replacement: {{ .Values.global.cattle.clusterId }} - {{- end }} - {{ if .Values.global.cattle.clusterName}} - - sourceLabels: [__address__] - targetLabel: cluster_name - replacement: {{ .Values.global.cattle.clusterName }} - {{- end }} -{{- if .Values.kubeDns.serviceMonitor.dnsmasqRelabelings }} - relabelings: -{{ toYaml .Values.kubeDns.serviceMonitor.dnsmasqRelabelings | indent 4 }} -{{- end }} - - port: http-metrics-skydns - {{- if .Values.kubeDns.serviceMonitor.interval }} - interval: {{ .Values.kubeDns.serviceMonitor.interval }} - {{- end }} - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token -{{- if .Values.kubeDns.serviceMonitor.metricRelabelings }} - metricRelabelings: -{{ tpl (toYaml .Values.kubeDns.serviceMonitor.metricRelabelings | indent 4) . }} -{{- end }} -{{- if .Values.kubeDns.serviceMonitor.relabelings }} - relabelings: -{{ tpl (toYaml .Values.kubeDns.serviceMonitor.relabelings | indent 4) . }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-etcd/endpoints.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-etcd/endpoints.yaml deleted file mode 100644 index babbd3efc7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-etcd/endpoints.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if and .Values.kubeEtcd.enabled .Values.kubeEtcd.endpoints .Values.kubernetesServiceMonitors.enabled }} -apiVersion: v1 -kind: Endpoints -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-kube-etcd - labels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-etcd - k8s-app: etcd-server -{{ include "kube-prometheus-stack.labels" . | indent 4 }} - namespace: kube-system -subsets: - - addresses: - {{- range .Values.kubeEtcd.endpoints }} - - ip: {{ . }} - {{- end }} - ports: - - name: http-metrics - port: {{ .Values.kubeEtcd.service.port }} - protocol: TCP -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-etcd/service.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-etcd/service.yaml deleted file mode 100644 index eb519e623a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-etcd/service.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{- if and .Values.kubeEtcd.enabled .Values.kubeEtcd.service.enabled .Values.kubernetesServiceMonitors.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-kube-etcd - labels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-etcd - jobLabel: kube-etcd -{{ include "kube-prometheus-stack.labels" . | indent 4 }} - namespace: kube-system -spec: - clusterIP: None - ports: - - name: http-metrics - port: {{ .Values.kubeEtcd.service.port }} - protocol: TCP - targetPort: {{ .Values.kubeEtcd.service.targetPort }} -{{- if .Values.kubeEtcd.endpoints }}{{- else }} - selector: - {{- if .Values.kubeEtcd.service.selector }} -{{ toYaml .Values.kubeEtcd.service.selector | indent 4 }} - {{- else}} - component: etcd - {{- end}} -{{- end }} - type: ClusterIP -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-etcd/servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-etcd/servicemonitor.yaml deleted file mode 100644 index 02de438288..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-etcd/servicemonitor.yaml +++ /dev/null @@ -1,67 +0,0 @@ -{{- if and .Values.kubeEtcd.enabled .Values.kubeEtcd.serviceMonitor.enabled .Values.kubernetesServiceMonitors.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-kube-etcd - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-etcd - {{- with .Values.kubeEtcd.serviceMonitor.additionalLabels }} - {{- toYaml . | nindent 4 }} - {{- end }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - jobLabel: jobLabel - {{- include "servicemonitor.scrapeLimits" .Values.kubeEtcd.serviceMonitor | nindent 4 }} - selector: - matchLabels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-etcd - release: {{ $.Release.Name | quote }} - namespaceSelector: - matchNames: - - "kube-system" - endpoints: - - port: http-metrics - {{- if .Values.kubeEtcd.serviceMonitor.interval }} - interval: {{ .Values.kubeEtcd.serviceMonitor.interval }} - {{- end }} - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token - {{- if .Values.kubeEtcd.serviceMonitor.proxyUrl }} - proxyUrl: {{ .Values.kubeEtcd.serviceMonitor.proxyUrl}} - {{- end }} - {{- if eq .Values.kubeEtcd.serviceMonitor.scheme "https" }} - scheme: https - tlsConfig: - {{- if .Values.kubeEtcd.serviceMonitor.serverName }} - serverName: {{ .Values.kubeEtcd.serviceMonitor.serverName }} - {{- end }} - {{- if .Values.kubeEtcd.serviceMonitor.caFile }} - caFile: {{ .Values.kubeEtcd.serviceMonitor.caFile }} - {{- end }} - {{- if .Values.kubeEtcd.serviceMonitor.certFile }} - certFile: {{ .Values.kubeEtcd.serviceMonitor.certFile }} - {{- end }} - {{- if .Values.kubeEtcd.serviceMonitor.keyFile }} - keyFile: {{ .Values.kubeEtcd.serviceMonitor.keyFile }} - {{- end}} - insecureSkipVerify: {{ .Values.kubeEtcd.serviceMonitor.insecureSkipVerify }} - {{- end }} - metricRelabelings: - {{- if .Values.kubeEtcd.serviceMonitor.metricRelabelings }} - {{ tpl (toYaml .Values.kubeEtcd.serviceMonitor.metricRelabelings | indent 4) . }} - {{- end }} - {{ if .Values.global.cattle.clusterId }} - - sourceLabels: [__address__] - targetLabel: cluster_id - replacement: {{ .Values.global.cattle.clusterId }} - {{- end }} - {{ if .Values.global.cattle.clusterName}} - - sourceLabels: [__address__] - targetLabel: cluster_name - replacement: {{ .Values.global.cattle.clusterName }} - {{- end }} -{{- if .Values.kubeEtcd.serviceMonitor.relabelings }} - relabelings: -{{ tpl (toYaml .Values.kubeEtcd.serviceMonitor.relabelings | indent 4) . }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-proxy/endpoints.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-proxy/endpoints.yaml deleted file mode 100644 index 8e7c0618c5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-proxy/endpoints.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if and .Values.kubeProxy.enabled .Values.kubeProxy.endpoints .Values.kubernetesServiceMonitors.enabled }} -apiVersion: v1 -kind: Endpoints -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-kube-proxy - labels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-proxy - k8s-app: kube-proxy -{{ include "kube-prometheus-stack.labels" . | indent 4 }} - namespace: kube-system -subsets: - - addresses: - {{- range .Values.kubeProxy.endpoints }} - - ip: {{ . }} - {{- end }} - ports: - - name: http-metrics - port: {{ .Values.kubeProxy.service.port }} - protocol: TCP -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-proxy/service.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-proxy/service.yaml deleted file mode 100644 index 03aa62b13e..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-proxy/service.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{- if and .Values.kubeProxy.enabled .Values.kubeProxy.service.enabled .Values.kubernetesServiceMonitors.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-kube-proxy - labels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-proxy - jobLabel: kube-proxy -{{ include "kube-prometheus-stack.labels" . | indent 4 }} - namespace: kube-system -spec: - clusterIP: None - ports: - - name: http-metrics - port: {{ .Values.kubeProxy.service.port }} - protocol: TCP - targetPort: {{ .Values.kubeProxy.service.targetPort }} -{{- if .Values.kubeProxy.endpoints }}{{- else }} - selector: - {{- if .Values.kubeProxy.service.selector }} -{{ toYaml .Values.kubeProxy.service.selector | indent 4 }} - {{- else}} - k8s-app: kube-proxy - {{- end}} -{{- end }} - type: ClusterIP -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-proxy/servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-proxy/servicemonitor.yaml deleted file mode 100644 index 6c16e6a811..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-proxy/servicemonitor.yaml +++ /dev/null @@ -1,55 +0,0 @@ -{{- if and .Values.kubeProxy.enabled .Values.kubeProxy.serviceMonitor.enabled .Values.kubernetesServiceMonitors.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-kube-proxy - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-proxy - {{- with .Values.kubeProxy.serviceMonitor.additionalLabels }} - {{- toYaml . | nindent 4 }} - {{- end }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - jobLabel: jobLabel - {{- include "servicemonitor.scrapeLimits" .Values.kubeProxy.serviceMonitor | nindent 2 }} - selector: - matchLabels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-proxy - release: {{ $.Release.Name | quote }} - namespaceSelector: - matchNames: - - "kube-system" - endpoints: - - port: http-metrics - {{- if .Values.kubeProxy.serviceMonitor.interval }} - interval: {{ .Values.kubeProxy.serviceMonitor.interval }} - {{- end }} - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token - {{- if .Values.kubeProxy.serviceMonitor.proxyUrl }} - proxyUrl: {{ .Values.kubeProxy.serviceMonitor.proxyUrl}} - {{- end }} - {{- if .Values.kubeProxy.serviceMonitor.https }} - scheme: https - tlsConfig: - caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - {{- end}} - metricRelabelings: - {{- if .Values.kubeProxy.serviceMonitor.metricRelabelings }} - {{ tpl (toYaml .Values.kubeProxy.serviceMonitor.metricRelabelings | indent 4) . }} - {{- end }} - {{ if .Values.global.cattle.clusterId }} - - sourceLabels: [__address__] - targetLabel: cluster_id - replacement: {{ .Values.global.cattle.clusterId }} - {{- end }} - {{ if .Values.global.cattle.clusterName}} - - sourceLabels: [__address__] - targetLabel: cluster_name - replacement: {{ .Values.global.cattle.clusterName }} - {{- end }} -{{- if .Values.kubeProxy.serviceMonitor.relabelings }} - relabelings: -{{ tpl (toYaml .Values.kubeProxy.serviceMonitor.relabelings | indent 4) . }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-scheduler/endpoints.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-scheduler/endpoints.yaml deleted file mode 100644 index 3b93dc2936..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-scheduler/endpoints.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- if and .Values.kubeScheduler.enabled .Values.kubeScheduler.endpoints .Values.kubernetesServiceMonitors.enabled }} -apiVersion: v1 -kind: Endpoints -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-kube-scheduler - labels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-scheduler - k8s-app: kube-scheduler -{{ include "kube-prometheus-stack.labels" . | indent 4 }} - namespace: kube-system -subsets: - - addresses: - {{- range .Values.kubeScheduler.endpoints }} - - ip: {{ . }} - {{- end }} - ports: - - name: http-metrics - {{- $kubeSchedulerDefaultInsecurePort := 10251 }} - {{- $kubeSchedulerDefaultSecurePort := 10259 }} - port: {{ include "kube-prometheus-stack.kubeScheduler.insecureScrape" (list . $kubeSchedulerDefaultInsecurePort $kubeSchedulerDefaultSecurePort .Values.kubeScheduler.service.port) }} - protocol: TCP -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-scheduler/service.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-scheduler/service.yaml deleted file mode 100644 index d9fb4575b2..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-scheduler/service.yaml +++ /dev/null @@ -1,29 +0,0 @@ -{{- if and .Values.kubeScheduler.enabled .Values.kubeScheduler.service.enabled .Values.kubernetesServiceMonitors.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-kube-scheduler - labels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-scheduler - jobLabel: kube-scheduler -{{ include "kube-prometheus-stack.labels" . | indent 4 }} - namespace: kube-system -spec: - clusterIP: None - ports: - - name: http-metrics - {{- $kubeSchedulerDefaultInsecurePort := 10251 }} - {{- $kubeSchedulerDefaultSecurePort := 10259 }} - port: {{ include "kube-prometheus-stack.kubeScheduler.insecureScrape" (list . $kubeSchedulerDefaultInsecurePort $kubeSchedulerDefaultSecurePort .Values.kubeScheduler.service.port) }} - protocol: TCP - targetPort: {{ include "kube-prometheus-stack.kubeScheduler.insecureScrape" (list . $kubeSchedulerDefaultInsecurePort $kubeSchedulerDefaultSecurePort .Values.kubeScheduler.service.targetPort) }} -{{- if .Values.kubeScheduler.endpoints }}{{- else }} - selector: - {{- if .Values.kubeScheduler.service.selector }} -{{ toYaml .Values.kubeScheduler.service.selector | indent 4 }} - {{- else}} - component: kube-scheduler - {{- end}} -{{- end }} - type: ClusterIP -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-scheduler/servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-scheduler/servicemonitor.yaml deleted file mode 100644 index 48f31bf03f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-scheduler/servicemonitor.yaml +++ /dev/null @@ -1,61 +0,0 @@ -{{- if and .Values.kubeScheduler.enabled .Values.kubeScheduler.serviceMonitor.enabled .Values.kubernetesServiceMonitors.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-kube-scheduler - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-scheduler - {{- with .Values.kubeScheduler.serviceMonitor.additionalLabels }} - {{- toYaml . | nindent 4 }} - {{- end }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - jobLabel: jobLabel - {{- include "servicemonitor.scrapeLimits" .Values.kubeScheduler.serviceMonitor | nindent 2 }} - selector: - matchLabels: - app: {{ template "kube-prometheus-stack.name" . }}-kube-scheduler - release: {{ $.Release.Name | quote }} - namespaceSelector: - matchNames: - - "kube-system" - endpoints: - - port: http-metrics - {{- if .Values.kubeScheduler.serviceMonitor.interval }} - interval: {{ .Values.kubeScheduler.serviceMonitor.interval }} - {{- end }} - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token - {{- if .Values.kubeScheduler.serviceMonitor.proxyUrl }} - proxyUrl: {{ .Values.kubeScheduler.serviceMonitor.proxyUrl}} - {{- end }} - {{- if eq (include "kube-prometheus-stack.kubeScheduler.insecureScrape" (list . false true .Values.kubeScheduler.serviceMonitor.https )) "true" }} - scheme: https - tlsConfig: - caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - {{- if eq (include "kube-prometheus-stack.kubeScheduler.insecureScrape" (list . nil true .Values.kubeScheduler.serviceMonitor.insecureSkipVerify)) "true" }} - insecureSkipVerify: true - {{- end }} - {{- if .Values.kubeScheduler.serviceMonitor.serverName }} - serverName: {{ .Values.kubeScheduler.serviceMonitor.serverName }} - {{- end}} - {{- end}} - metricRelabelings: - {{- if .Values.kubeScheduler.serviceMonitor.metricRelabelings }} - {{ tpl (toYaml .Values.kubeScheduler.serviceMonitor.metricRelabelings | indent 4) . }} - {{- end }} - {{ if .Values.global.cattle.clusterId }} - - sourceLabels: [__address__] - targetLabel: cluster_id - replacement: {{ .Values.global.cattle.clusterId }} - {{- end }} - {{ if .Values.global.cattle.clusterName}} - - sourceLabels: [__address__] - targetLabel: cluster_name - replacement: {{ .Values.global.cattle.clusterName }} - {{- end }} -{{- if .Values.kubeScheduler.serviceMonitor.relabelings }} - relabelings: -{{ tpl (toYaml .Values.kubeScheduler.serviceMonitor.relabelings | indent 4) . }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-state-metrics/validate.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-state-metrics/validate.yaml deleted file mode 100644 index 9211b3d771..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kube-state-metrics/validate.yaml +++ /dev/null @@ -1,7 +0,0 @@ -{{- if .Values.kubeStateMetrics.enabled }} -{{- if not (kindIs "invalid" .Values.kubeStateMetrics.serviceMonitor) }} -{{- if .Values.kubeStateMetrics.serviceMonitor.namespaceOverride }} -{{- fail "kubeStateMetrics.serviceMonitor.namespaceOverride was removed. Please use kube-state-metrics.namespaceOverride instead." }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kubelet/servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kubelet/servicemonitor.yaml deleted file mode 100644 index 172dcde3a4..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/kubelet/servicemonitor.yaml +++ /dev/null @@ -1,230 +0,0 @@ -{{- if (and (not .Values.kubelet.enabled) .Values.hardenedKubelet.enabled) }} -{{ required "Cannot set .Values.hardenedKubelet.enabled=true when .Values.kubelet.enabled=false" "" }} -{{- end }} -{{- if (and .Values.kubelet.enabled .Values.kubernetesServiceMonitors.enabled (not .Values.hardenedKubelet.enabled) (not .Values.k3sServer.enabled)) }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-kubelet - namespace: {{ .Values.kubelet.namespace }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-kubelet - {{- with .Values.kubelet.serviceMonitor.additionalLabels }} - {{- toYaml . | nindent 4 }} - {{- end }} -{{- include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - {{- include "servicemonitor.scrapeLimits" .Values.kubelet.serviceMonitor | nindent 2 }} - endpoints: - {{- if .Values.kubelet.serviceMonitor.https }} - - port: https-metrics - scheme: https - {{- if .Values.kubelet.serviceMonitor.interval }} - interval: {{ .Values.kubelet.serviceMonitor.interval }} - {{- end }} - {{- if .Values.kubelet.serviceMonitor.proxyUrl }} - proxyUrl: {{ .Values.kubelet.serviceMonitor.proxyUrl }} - {{- end }} - {{- if .Values.kubelet.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.kubelet.serviceMonitor.scrapeTimeout }} - {{- end }} - tlsConfig: - caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - insecureSkipVerify: true - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token - honorLabels: true - metricRelabelings: - {{- if .Values.kubelet.serviceMonitor.metricRelabelings }} - {{ tpl (toYaml .Values.kubelet.serviceMonitor.metricRelabelings | indent 4) . }} - {{- end }} - {{ if .Values.global.cattle.clusterId }} - - sourceLabels: [__address__] - targetLabel: cluster_id - replacement: {{ .Values.global.cattle.clusterId }} - {{- end }} - {{ if .Values.global.cattle.clusterName}} - - sourceLabels: [__address__] - targetLabel: cluster_name - replacement: {{ .Values.global.cattle.clusterName }} - {{- end }} -{{- if .Values.kubelet.serviceMonitor.relabelings }} - relabelings: -{{ tpl (toYaml .Values.kubelet.serviceMonitor.relabelings | indent 4) . }} -{{- end }} -{{- if .Values.kubelet.serviceMonitor.cAdvisor }} - - port: https-metrics - scheme: https - path: /metrics/cadvisor - {{- if .Values.kubelet.serviceMonitor.interval }} - interval: {{ .Values.kubelet.serviceMonitor.interval }} - {{- end }} - {{- if .Values.kubelet.serviceMonitor.proxyUrl }} - proxyUrl: {{ .Values.kubelet.serviceMonitor.proxyUrl }} - {{- end }} - {{- if .Values.kubelet.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.kubelet.serviceMonitor.scrapeTimeout }} - {{- end }} - honorLabels: true - tlsConfig: - caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - insecureSkipVerify: true - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token -{{- if .Values.kubelet.serviceMonitor.cAdvisorMetricRelabelings }} - metricRelabelings: -{{ tpl (toYaml .Values.kubelet.serviceMonitor.cAdvisorMetricRelabelings | indent 4) . }} -{{- end }} -{{- if .Values.kubelet.serviceMonitor.cAdvisorRelabelings }} - relabelings: -{{ tpl (toYaml .Values.kubelet.serviceMonitor.cAdvisorRelabelings | indent 4) . }} -{{- end }} -{{- end }} -{{- if .Values.kubelet.serviceMonitor.probes }} - - port: https-metrics - scheme: https - path: /metrics/probes - {{- if .Values.kubelet.serviceMonitor.interval }} - interval: {{ .Values.kubelet.serviceMonitor.interval }} - {{- end }} - {{- if .Values.kubelet.serviceMonitor.proxyUrl }} - proxyUrl: {{ .Values.kubelet.serviceMonitor.proxyUrl }} - {{- end }} - {{- if .Values.kubelet.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.kubelet.serviceMonitor.scrapeTimeout }} - {{- end }} - honorLabels: true - tlsConfig: - caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - insecureSkipVerify: true - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token -{{- if .Values.kubelet.serviceMonitor.probesMetricRelabelings }} - metricRelabelings: -{{ tpl (toYaml .Values.kubelet.serviceMonitor.probesMetricRelabelings | indent 4) . }} -{{- end }} -{{- if .Values.kubelet.serviceMonitor.probesRelabelings }} - relabelings: -{{ tpl (toYaml .Values.kubelet.serviceMonitor.probesRelabelings | indent 4) . }} -{{- end }} -{{- end }} -{{- if .Values.kubelet.serviceMonitor.resource }} - - port: https-metrics - scheme: https - path: {{ include "kubelet.serviceMonitor.resourcePath" . }} - {{- if .Values.kubelet.serviceMonitor.interval }} - interval: {{ .Values.kubelet.serviceMonitor.interval }} - {{- end }} - {{- if .Values.kubelet.serviceMonitor.proxyUrl }} - proxyUrl: {{ .Values.kubelet.serviceMonitor.proxyUrl }} - {{- end }} - {{- if .Values.kubelet.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.kubelet.serviceMonitor.scrapeTimeout }} - {{- end }} - honorLabels: true - tlsConfig: - caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - insecureSkipVerify: true - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token -{{- if .Values.kubelet.serviceMonitor.resourceMetricRelabelings }} - metricRelabelings: -{{ tpl (toYaml .Values.kubelet.serviceMonitor.resourceMetricRelabelings | indent 4) . }} -{{- end }} -{{- if .Values.kubelet.serviceMonitor.resourceRelabelings }} - relabelings: -{{ tpl (toYaml .Values.kubelet.serviceMonitor.resourceRelabelings | indent 4) . }} -{{- end }} -{{- end }} - {{- else }} - - port: http-metrics - {{- if .Values.kubelet.serviceMonitor.interval }} - interval: {{ .Values.kubelet.serviceMonitor.interval }} - {{- end }} - {{- if .Values.kubelet.serviceMonitor.proxyUrl }} - proxyUrl: {{ .Values.kubelet.serviceMonitor.proxyUrl }} - {{- end }} - {{- if .Values.kubelet.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.kubelet.serviceMonitor.scrapeTimeout }} - {{- end }} - honorLabels: true -{{- if .Values.kubelet.serviceMonitor.metricRelabelings }} - metricRelabelings: -{{ tpl (toYaml .Values.kubelet.serviceMonitor.metricRelabelings | indent 4) . }} -{{- end }} -{{- if .Values.kubelet.serviceMonitor.relabelings }} - relabelings: -{{ tpl (toYaml .Values.kubelet.serviceMonitor.relabelings | indent 4) . }} -{{- end }} -{{- if .Values.kubelet.serviceMonitor.cAdvisor }} - - port: http-metrics - path: /metrics/cadvisor - {{- if .Values.kubelet.serviceMonitor.interval }} - interval: {{ .Values.kubelet.serviceMonitor.interval }} - {{- end }} - {{- if .Values.kubelet.serviceMonitor.proxyUrl }} - proxyUrl: {{ .Values.kubelet.serviceMonitor.proxyUrl }} - {{- end }} - {{- if .Values.kubelet.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.kubelet.serviceMonitor.scrapeTimeout }} - {{- end }} - honorLabels: true -{{- if .Values.kubelet.serviceMonitor.cAdvisorMetricRelabelings }} - metricRelabelings: -{{ tpl (toYaml .Values.kubelet.serviceMonitor.cAdvisorMetricRelabelings | indent 4) . }} -{{- end }} -{{- if .Values.kubelet.serviceMonitor.cAdvisorRelabelings }} - relabelings: -{{ tpl (toYaml .Values.kubelet.serviceMonitor.cAdvisorRelabelings | indent 4) . }} -{{- end }} -{{- if .Values.kubelet.serviceMonitor.probes }} - - port: http-metrics - path: /metrics/probes - {{- if .Values.kubelet.serviceMonitor.interval }} - interval: {{ .Values.kubelet.serviceMonitor.interval }} - {{- end }} - {{- if .Values.kubelet.serviceMonitor.proxyUrl }} - proxyUrl: {{ .Values.kubelet.serviceMonitor.proxyUrl }} - {{- end }} - {{- if .Values.kubelet.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.kubelet.serviceMonitor.scrapeTimeout }} - {{- end }} - honorLabels: true -{{- if .Values.kubelet.serviceMonitor.probesMetricRelabelings }} - metricRelabelings: -{{ tpl (toYaml .Values.kubelet.serviceMonitor.probesMetricRelabelings | indent 4) . }} -{{- end }} -{{- if .Values.kubelet.serviceMonitor.probesRelabelings }} - relabelings: -{{ tpl (toYaml .Values.kubelet.serviceMonitor.probesRelabelings | indent 4) . }} -{{- end }} -{{- end }} -{{- if .Values.kubelet.serviceMonitor.resource }} - - port: http-metrics - path: {{ include "kubelet.serviceMonitor.resourcePath" . }} - {{- if .Values.kubelet.serviceMonitor.interval }} - interval: {{ .Values.kubelet.serviceMonitor.interval }} - {{- end }} - {{- if .Values.kubelet.serviceMonitor.proxyUrl }} - proxyUrl: {{ .Values.kubelet.serviceMonitor.proxyUrl }} - {{- end }} - {{- if .Values.kubelet.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.kubelet.serviceMonitor.scrapeTimeout }} - {{- end }} - honorLabels: true -{{- if .Values.kubelet.serviceMonitor.resourceMetricRelabelings }} - metricRelabelings: -{{ tpl (toYaml .Values.kubelet.serviceMonitor.resourceMetricRelabelings | indent 4) . }} -{{- end }} -{{- if .Values.kubelet.serviceMonitor.resourceRelabelings }} - relabelings: -{{ tpl (toYaml .Values.kubelet.serviceMonitor.resourceRelabelings | indent 4) . }} -{{- end }} -{{- end }} -{{- end }} - {{- end }} - jobLabel: k8s-app - namespaceSelector: - matchNames: - - {{ .Values.kubelet.namespace }} - selector: - matchLabels: - app.kubernetes.io/name: kubelet - k8s-app: kubelet -{{- end}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/node-exporter/validate.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/node-exporter/validate.yaml deleted file mode 100644 index bdc73d6165..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/exporters/node-exporter/validate.yaml +++ /dev/null @@ -1,3 +0,0 @@ -{{- if (and (not .Values.nodeExporter.enabled) .Values.hardenedNodeExporter.enabled) }} -{{ required "Cannot set .Values.hardenedNodeExporter.enabled=true when .Values.nodeExporter.enabled=false" "" }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/configmap-dashboards.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/configmap-dashboards.yaml deleted file mode 100644 index e719009ffe..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/configmap-dashboards.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- if or (and .Values.grafana.enabled .Values.grafana.defaultDashboardsEnabled) .Values.grafana.forceDeployDashboards }} -{{- $files := .Files.Glob "dashboards-1.14/*.json" }} -{{- if $files }} -apiVersion: v1 -kind: ConfigMapList -items: -{{- range $path, $fileContents := $files }} -{{- $dashboardName := regexReplaceAll "(^.*/)(.*)\\.json$" $path "${2}" }} -- apiVersion: v1 - kind: ConfigMap - metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) $dashboardName | trunc 63 | trimSuffix "-" }} - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 6 }} - data: - {{ $dashboardName }}.json: {{ $.Files.Get $path | toJson }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/configmaps-datasources.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/configmaps-datasources.yaml deleted file mode 100644 index 6f8598e85a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/configmaps-datasources.yaml +++ /dev/null @@ -1,67 +0,0 @@ -{{- if or (and .Values.grafana.enabled .Values.grafana.sidecar.datasources.enabled) .Values.grafana.forceDeployDatasources }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-grafana-datasource - namespace: {{ default .Values.grafana.sidecar.datasources.searchNamespace (include "kube-prometheus-stack.namespace" .) }} -{{- if .Values.grafana.sidecar.datasources.annotations }} - annotations: - {{- toYaml .Values.grafana.sidecar.datasources.annotations | nindent 4 }} -{{- end }} - labels: - {{ $.Values.grafana.sidecar.datasources.label }}: {{ $.Values.grafana.sidecar.datasources.labelValue | quote }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - datasource.yaml: |- - apiVersion: 1 -{{- if .Values.grafana.deleteDatasources }} - deleteDatasources: -{{ tpl (toYaml .Values.grafana.deleteDatasources | indent 6) . }} -{{- end }} - datasources: -{{- $scrapeInterval := .Values.grafana.sidecar.datasources.defaultDatasourceScrapeInterval | default .Values.prometheus.prometheusSpec.scrapeInterval | default "30s" }} -{{- if .Values.grafana.sidecar.datasources.defaultDatasourceEnabled }} - - name: Prometheus - type: prometheus - uid: {{ .Values.grafana.sidecar.datasources.uid }} - {{- if .Values.grafana.sidecar.datasources.url }} - url: {{ .Values.grafana.sidecar.datasources.url }} - {{- else }} - url: http://{{ template "kube-prometheus-stack.fullname" . }}-prometheus.{{ template "kube-prometheus-stack.namespace" . }}:{{ .Values.prometheus.service.port }}/{{ trimPrefix "/" .Values.prometheus.prometheusSpec.routePrefix }} - {{- end }} - access: proxy - isDefault: {{ .Values.grafana.sidecar.datasources.isDefaultDatasource }} - jsonData: - httpMethod: {{ .Values.grafana.sidecar.datasources.httpMethod }} - timeInterval: {{ $scrapeInterval }} - {{- if .Values.grafana.sidecar.datasources.timeout }} - timeout: {{ .Values.grafana.sidecar.datasources.timeout }} - {{- end }} -{{- if .Values.grafana.sidecar.datasources.exemplarTraceIdDestinations }} - exemplarTraceIdDestinations: - - datasourceUid: {{ .Values.grafana.sidecar.datasources.exemplarTraceIdDestinations.datasourceUid }} - name: {{ .Values.grafana.sidecar.datasources.exemplarTraceIdDestinations.traceIdLabelName }} -{{- end }} -{{- if .Values.grafana.sidecar.datasources.createPrometheusReplicasDatasources }} -{{- range until (int .Values.prometheus.prometheusSpec.replicas) }} - - name: Prometheus-{{ . }} - type: prometheus - uid: {{ $.Values.grafana.sidecar.datasources.uid }}-replica-{{ . }} - url: http://prometheus-{{ template "kube-prometheus-stack.prometheus.crname" $ }}-{{ . }}.prometheus-operated:9090/{{ trimPrefix "/" $.Values.prometheus.prometheusSpec.routePrefix }} - access: proxy - isDefault: false - jsonData: - timeInterval: {{ $scrapeInterval }} -{{- if $.Values.grafana.sidecar.datasources.exemplarTraceIdDestinations }} - exemplarTraceIdDestinations: - - datasourceUid: {{ .Values.grafana.sidecar.datasources.exemplarTraceIdDestinations.datasourceUid }} - name: {{ .Values.grafana.sidecar.datasources.exemplarTraceIdDestinations.traceIdLabelName }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} -{{- if .Values.grafana.additionalDataSources }} -{{ tpl (toYaml .Values.grafana.additionalDataSources | indent 4) . }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/alertmanager-overview.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/alertmanager-overview.yaml deleted file mode 100644 index 3fe5bcdd02..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/alertmanager-overview.yaml +++ /dev/null @@ -1,616 +0,0 @@ -{{- /* -Generated from 'alertmanager-overview' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -{{- if and .Values.alertmanager.enabled .Values.alertmanager.serviceMonitor.selfMonitor }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "alertmanager-overview" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - alertmanager-overview.json: |- - { - "__inputs": [ - - ], - "__requires": [ - - ], - "annotations": { - "list": [ - - ] - }, - "editable": false, - "gnetId": null, - "graphTooltip": 1, - "hideControls": false, - "id": null, - "links": [ - - ], - "refresh": "30s", - "rows": [ - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "description": "current set of alerts stored in the Alertmanager", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 2, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(alertmanager_alerts{namespace=~\"$namespace\",service=~\"$service\"}) by (namespace,service,instance)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Alerts", - "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": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "description": "rate of successful and invalid alerts received by the Alertmanager", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 3, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(alertmanager_alerts_received_total{namespace=~\"$namespace\",service=~\"$service\"}[$__rate_interval])) by (namespace,service,instance)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} Received", - "refId": "A" - }, - { - "expr": "sum(rate(alertmanager_alerts_invalid_total{namespace=~\"$namespace\",service=~\"$service\"}[$__rate_interval])) by (namespace,service,instance)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} Invalid", - "refId": "B" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Alerts receive rate", - "tooltip": { - "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": null, - "show": true - }, - { - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Alerts", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "description": "rate of successful and invalid notifications sent by the Alertmanager", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 4, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": "integration", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(alertmanager_notifications_total{namespace=~\"$namespace\",service=~\"$service\", integration=\"$integration\"}[$__rate_interval])) by (integration,namespace,service,instance)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} Total", - "refId": "A" - }, - { - "expr": "sum(rate(alertmanager_notifications_failed_total{namespace=~\"$namespace\",service=~\"$service\", integration=\"$integration\"}[$__rate_interval])) by (integration,namespace,service,instance)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} Failed", - "refId": "B" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "$integration: Notifications Send Rate", - "tooltip": { - "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": null, - "show": true - }, - { - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "description": "latency of notifications sent by the Alertmanager", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 5, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": "integration", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99,\n sum(rate(alertmanager_notification_latency_seconds_bucket{namespace=~\"$namespace\",service=~\"$service\", integration=\"$integration\"}[$__rate_interval])) by (le,namespace,service,instance)\n) \n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} 99th Percentile", - "refId": "A" - }, - { - "expr": "histogram_quantile(0.50,\n sum(rate(alertmanager_notification_latency_seconds_bucket{namespace=~\"$namespace\",service=~\"$service\", integration=\"$integration\"}[$__rate_interval])) by (le,namespace,service,instance)\n) \n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} Median", - "refId": "B" - }, - { - "expr": "sum(rate(alertmanager_notification_latency_seconds_sum{namespace=~\"$namespace\",service=~\"$service\", integration=\"$integration\"}[$__rate_interval])) by (namespace,service,instance)\n/\nsum(rate(alertmanager_notification_latency_seconds_count{namespace=~\"$namespace\",service=~\"$service\", integration=\"$integration\"}[$__rate_interval])) by (namespace,service,instance)\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} Average", - "refId": "C" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "$integration: Notification Duration", - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Notifications", - "titleSize": "h6", - "type": "row" - } - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "alertmanager-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": "namespace", - "multi": false, - "name": "namespace", - "options": [ - - ], - "query": "label_values(alertmanager_alerts, namespace)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": "service", - "multi": false, - "name": "service", - "options": [ - - ], - "query": "label_values(alertmanager_alerts, service)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "text": "all", - "value": "$__all" - }, - "datasource": "$datasource", - "hide": 2, - "includeAll": true, - "label": null, - "multi": false, - "name": "integration", - "options": [ - - ], - "query": "label_values(alertmanager_notifications_total{integration=~\".*\"}, integration)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Alertmanager / Overview", - "uid": "alertmanager-overview", - "version": 0 - } -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/apiserver.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/apiserver.yaml deleted file mode 100644 index d4cf09f180..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/apiserver.yaml +++ /dev/null @@ -1,1772 +0,0 @@ -{{- /* -Generated from 'apiserver' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled .Values.kubeApiServer.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "apiserver" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - apiserver.json: |- - { - "__inputs": [ - - ], - "__requires": [ - - ], - "annotations": { - "list": [ - - ] - }, - "editable": false, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "id": null, - "links": [ - - ], - "panels": [ - { - "content": "The SLO (service level objective) and other metrics displayed on this dashboard are for informational purposes only.", - "datasource": null, - "description": "The SLO (service level objective) and other metrics displayed on this dashboard are for informational purposes only.", - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 2, - "mode": "markdown", - "span": 12, - "title": "Notice", - "type": "text" - } - ], - "refresh": "10s", - "rows": [ - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "$datasource", - "decimals": 3, - "description": "How many percent of requests (both read and write) in 30 days have been answered successfully and fast enough?", - "format": "percentunit", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - - }, - "id": 3, - "interval": "1m", - "legend": { - "alignAsTable": true, - "rightSide": true - }, - "links": [ - - ], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "span": 4, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "apiserver_request:availability30d{verb=\"all\", cluster=\"$cluster\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "", - "title": "Availability (30d) > 99.000%", - "tooltip": { - "shared": false - }, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "decimals": 3, - "description": "How much error budget is left looking at our 0.990% availability guarantees?", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 4, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 8, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "100 * (apiserver_request:availability30d{verb=\"all\", cluster=\"$cluster\"} - 0.990000)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "errorbudget", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "ErrorBudget (30d) > 99.000%", - "tooltip": { - "shared": false, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "decimals": 3, - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "decimals": 3, - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "$datasource", - "decimals": 3, - "description": "How many percent of read requests (LIST,GET) in 30 days have been answered successfully and fast enough?", - "format": "percentunit", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - - }, - "id": 5, - "interval": "1m", - "legend": { - "alignAsTable": true, - "rightSide": true - }, - "links": [ - - ], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "span": 3, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "apiserver_request:availability30d{verb=\"read\", cluster=\"$cluster\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "", - "title": "Read Availability (30d)", - "tooltip": { - "shared": false - }, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "description": "How many read requests (LIST,GET) per second do the apiservers get by code?", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 6, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - { - "alias": "/2../i", - "color": "#56A64B" - }, - { - "alias": "/3../i", - "color": "#F2CC0C" - }, - { - "alias": "/4../i", - "color": "#3274D9" - }, - { - "alias": "/5../i", - "color": "#E02F44" - } - ], - "spaceLength": 10, - "span": 3, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum by (code) (code_resource:apiserver_request_total:rate5m{verb=\"read\", cluster=\"$cluster\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}} code {{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Read SLI - Requests", - "tooltip": { - "shared": false, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "reqps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "reqps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "description": "How many percent of read requests (LIST,GET) per second are returned with errors (5xx)?", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 7, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 3, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum by (resource) (code_resource:apiserver_request_total:rate5m{verb=\"read\",code=~\"5..\", cluster=\"$cluster\"}) / sum by (resource) (code_resource:apiserver_request_total:rate5m{verb=\"read\", cluster=\"$cluster\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}} resource {{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Read SLI - Errors", - "tooltip": { - "shared": false, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "description": "How many seconds is the 99th percentile for reading (LIST|GET) a given resource?", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 8, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 3, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "cluster_quantile:apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds:histogram_quantile{verb=\"read\", cluster=\"$cluster\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}} resource {{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Read SLI - Duration", - "tooltip": { - "shared": false, - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "$datasource", - "decimals": 3, - "description": "How many percent of write requests (POST|PUT|PATCH|DELETE) in 30 days have been answered successfully and fast enough?", - "format": "percentunit", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - - }, - "id": 9, - "interval": "1m", - "legend": { - "alignAsTable": true, - "rightSide": true - }, - "links": [ - - ], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "span": 3, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "apiserver_request:availability30d{verb=\"write\", cluster=\"$cluster\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "", - "title": "Write Availability (30d)", - "tooltip": { - "shared": false - }, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "description": "How many write requests (POST|PUT|PATCH|DELETE) per second do the apiservers get by code?", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 10, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - { - "alias": "/2../i", - "color": "#56A64B" - }, - { - "alias": "/3../i", - "color": "#F2CC0C" - }, - { - "alias": "/4../i", - "color": "#3274D9" - }, - { - "alias": "/5../i", - "color": "#E02F44" - } - ], - "spaceLength": 10, - "span": 3, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum by (code) (code_resource:apiserver_request_total:rate5m{verb=\"write\", cluster=\"$cluster\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}} code {{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Write SLI - Requests", - "tooltip": { - "shared": false, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "reqps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "reqps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "description": "How many percent of write requests (POST|PUT|PATCH|DELETE) per second are returned with errors (5xx)?", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 11, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 3, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum by (resource) (code_resource:apiserver_request_total:rate5m{verb=\"write\",code=~\"5..\", cluster=\"$cluster\"}) / sum by (resource) (code_resource:apiserver_request_total:rate5m{verb=\"write\", cluster=\"$cluster\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}} resource {{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Write SLI - Errors", - "tooltip": { - "shared": false, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "description": "How many seconds is the 99th percentile for writing (POST|PUT|PATCH|DELETE) a given resource?", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 12, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 3, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "cluster_quantile:apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds:histogram_quantile{verb=\"write\", cluster=\"$cluster\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}} resource {{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Write SLI - Duration", - "tooltip": { - "shared": false, - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 13, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(workqueue_adds_total{job=\"apiserver\", instance=~\"$instance\", cluster=\"$cluster\"}[$__rate_interval])) by (instance, name)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} {{`{{`}}name{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Work Queue Add Rate", - "tooltip": { - "shared": false, - "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": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 14, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(workqueue_depth{job=\"apiserver\", instance=~\"$instance\", cluster=\"$cluster\"}[$__rate_interval])) by (instance, name)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} {{`{{`}}name{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Work Queue Depth", - "tooltip": { - "shared": false, - "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 - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 15, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(workqueue_queue_duration_seconds_bucket{job=\"apiserver\", instance=~\"$instance\", cluster=\"$cluster\"}[$__rate_interval])) by (instance, name, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} {{`{{`}}name{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Work Queue Latency", - "tooltip": { - "shared": false, - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 16, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "process_resident_memory_bytes{job=\"apiserver\",instance=~\"$instance\", cluster=\"$cluster\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory", - "tooltip": { - "shared": false, - "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": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 17, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(process_cpu_seconds_total{job=\"apiserver\",instance=~\"$instance\", cluster=\"$cluster\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU usage", - "tooltip": { - "shared": false, - "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 - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 18, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "go_goroutines{job=\"apiserver\",instance=~\"$instance\", cluster=\"$cluster\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Goroutines", - "tooltip": { - "shared": false, - "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 - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - } - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "kubernetes-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": "cluster", - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(up{job=\"apiserver\"}, cluster)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "instance", - "options": [ - - ], - "query": "label_values(up{job=\"apiserver\", cluster=\"$cluster\"}, instance)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Kubernetes / API server", - "uid": "09ec8aa1e996d6ffcd6817bbaff4db1b", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/cluster-total.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/cluster-total.yaml deleted file mode 100644 index c351d0c0c2..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/cluster-total.yaml +++ /dev/null @@ -1,1882 +0,0 @@ -{{- /* -Generated from 'cluster-total' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "cluster-total" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - cluster-total.json: |- - { - "__inputs": [ - - ], - "__requires": [ - - ], - "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, - "hideControls": false, - "id": null, - "links": [ - - ], - "panels": [ - { - "collapse": false, - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 2, - "panels": [ - - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Current Bandwidth", - "titleSize": "h6", - "type": "row" - }, - { - "aliasColors": { - - }, - "bars": true, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 1 - }, - "id": 3, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": false, - "linewidth": 1, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "null", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\",namespace=~\".+\"}[$interval:$resolution])) by (namespace))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Current Rate of Bytes Received", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "series", - "name": null, - "show": false, - "values": [ - "current" - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": true, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 1 - }, - "id": 4, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": false, - "linewidth": 1, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "null", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\",namespace=~\".+\"}[$interval:$resolution])) by (namespace))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Current Rate of Bytes Transmitted", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "series", - "name": null, - "show": false, - "values": [ - "current" - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "columns": [ - { - "text": "Time", - "value": "Time" - }, - { - "text": "Value #A", - "value": "Value #A" - }, - { - "text": "Value #B", - "value": "Value #B" - }, - { - "text": "Value #C", - "value": "Value #C" - }, - { - "text": "Value #D", - "value": "Value #D" - }, - { - "text": "Value #E", - "value": "Value #E" - }, - { - "text": "Value #F", - "value": "Value #F" - }, - { - "text": "Value #G", - "value": "Value #G" - }, - { - "text": "Value #H", - "value": "Value #H" - }, - { - "text": "namespace", - "value": "namespace" - } - ], - "datasource": "$datasource", - "fill": 1, - "fontSize": "90%", - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 10 - }, - "id": 5, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "null as zero", - "renderer": "flot", - "scroll": true, - "showHeader": true, - "sort": { - "col": 0, - "desc": false - }, - "spaceLength": 10, - "span": 24, - "styles": [ - { - "alias": "Time", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Time", - "thresholds": [ - - ], - "type": "hidden", - "unit": "short" - }, - { - "alias": "Current Bandwidth Received", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Current Bandwidth Transmitted", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Average Bandwidth Received", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Average Bandwidth Transmitted", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Rate of Received Packets", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Transmitted Packets", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Received Packets Dropped", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #G", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Transmitted Packets Dropped", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #H", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Namespace", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": true, - "linkTooltip": "Drill down", - "linkUrl": "d/8b7a8b326d7a6f1f04244066368c67af/kubernetes-networking-namespace-pods?orgId=1&refresh=30s&var-namespace=$__cell", - "pattern": "namespace", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - } - ], - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\",namespace=~\".+\"}[$interval:$resolution])) by (namespace))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "sort_desc(sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\",namespace=~\".+\"}[$interval:$resolution])) by (namespace))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sort_desc(avg(irate(container_network_receive_bytes_total{cluster=\"$cluster\",namespace=~\".+\"}[$interval:$resolution])) by (namespace))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sort_desc(avg(irate(container_network_transmit_bytes_total{cluster=\"$cluster\",namespace=~\".+\"}[$interval:$resolution])) by (namespace))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sort_desc(sum(irate(container_network_receive_packets_total{cluster=\"$cluster\",namespace=~\".+\"}[$interval:$resolution])) by (namespace))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - }, - { - "expr": "sort_desc(sum(irate(container_network_transmit_packets_total{cluster=\"$cluster\",namespace=~\".+\"}[$interval:$resolution])) by (namespace))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "F", - "step": 10 - }, - { - "expr": "sort_desc(sum(irate(container_network_receive_packets_dropped_total{cluster=\"$cluster\",namespace=~\".+\"}[$interval:$resolution])) by (namespace))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "G", - "step": 10 - }, - { - "expr": "sort_desc(sum(irate(container_network_transmit_packets_dropped_total{cluster=\"$cluster\",namespace=~\".+\"}[$interval:$resolution])) by (namespace))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "H", - "step": 10 - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Current Status", - "type": "table" - }, - { - "collapse": true, - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 10 - }, - "id": 6, - "panels": [ - { - "aliasColors": { - - }, - "bars": true, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 11 - }, - "id": 7, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": false, - "linewidth": 1, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "null", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(avg(irate(container_network_receive_bytes_total{cluster=\"$cluster\",namespace=~\".+\"}[$interval:$resolution])) by (namespace))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Average Rate of Bytes Received", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "series", - "name": null, - "show": false, - "values": [ - "current" - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": true, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 11 - }, - "id": 8, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": false, - "linewidth": 1, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "null", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(avg(irate(container_network_transmit_bytes_total{cluster=\"$cluster\",namespace=~\".+\"}[$interval:$resolution])) by (namespace))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Average Rate of Bytes Transmitted", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "series", - "name": null, - "show": false, - "values": [ - "current" - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Average Bandwidth", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 11 - }, - "id": 9, - "panels": [ - - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Bandwidth History", - "titleSize": "h6", - "type": "row" - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 12 - }, - "id": 10, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": true, - "min": true, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\",namespace=~\".+\"}[$interval:$resolution])) by (namespace))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Receive Bandwidth", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 21 - }, - "id": 11, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": true, - "min": true, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\",namespace=~\".+\"}[$interval:$resolution])) by (namespace))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Transmit Bandwidth", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "collapse": true, - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 30 - }, - "id": 12, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 31 - }, - "id": 13, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": true, - "min": true, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_receive_packets_total{cluster=\"$cluster\",namespace=~\".+\"}[$interval:$resolution])) by (namespace))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 40 - }, - "id": 14, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": true, - "min": true, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_transmit_packets_total{cluster=\"$cluster\",namespace=~\".+\"}[$interval:$resolution])) by (namespace))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Packets", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": true, - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 31 - }, - "id": 15, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 50 - }, - "id": 16, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": true, - "min": true, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_receive_packets_dropped_total{cluster=\"$cluster\",namespace=~\".+\"}[$interval:$resolution])) by (namespace))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets Dropped", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 59 - }, - "id": 17, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": true, - "min": true, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_transmit_packets_dropped_total{cluster=\"$cluster\",namespace=~\".+\"}[$interval:$resolution])) by (namespace))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets Dropped", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 59 - }, - "id": 18, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": true, - "min": true, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [ - { - "targetBlank": true, - "title": "What is TCP Retransmit?", - "url": "https://accedian.com/enterprises/blog/network-packet-loss-retransmissions-and-duplicate-acknowledgements/" - } - ], - "minSpan": 24, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(rate(node_netstat_Tcp_RetransSegs{cluster=\"$cluster\"}[$interval:$resolution]) / rate(node_netstat_Tcp_OutSegs{cluster=\"$cluster\"}[$interval:$resolution])) by (instance))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of TCP Retransmits out of all sent segments", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 59 - }, - "id": 19, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": true, - "min": true, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [ - { - "targetBlank": true, - "title": "Why monitor SYN retransmits?", - "url": "https://github.com/prometheus/node_exporter/issues/1023#issuecomment-408128365" - } - ], - "minSpan": 24, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(rate(node_netstat_TcpExt_TCPSynRetrans{cluster=\"$cluster\"}[$interval:$resolution]) / rate(node_netstat_Tcp_RetransSegs{cluster=\"$cluster\"}[$interval:$resolution])) by (instance))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of TCP SYN Retransmits out of all retransmits", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Errors", - "titleSize": "h6", - "type": "row" - } - ], - "refresh": "10s", - "rows": [ - - ], - "schemaVersion": 18, - "style": "dark", - "tags": [ - "kubernetes-mixin" - ], - "templating": { - "list": [ - { - "allValue": null, - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "5m", - "value": "5m" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "resolution", - "options": [ - { - "selected": false, - "text": "30s", - "value": "30s" - }, - { - "selected": true, - "text": "5m", - "value": "5m" - }, - { - "selected": false, - "text": "1h", - "value": "1h" - } - ], - "query": "30s,5m,1h", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "interval", - "useTags": false - }, - { - "allValue": null, - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "5m", - "value": "5m" - }, - "datasource": "$datasource", - "hide": 2, - "includeAll": false, - "label": null, - "multi": false, - "name": "interval", - "options": [ - { - "selected": true, - "text": "4h", - "value": "4h" - } - ], - "query": "4h", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "interval", - "useTags": false - }, - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": null, - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(up{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\"}, cluster)", - "refresh": 2, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Kubernetes / Networking / Cluster", - "uid": "ff635a025bcfea7bc3dd4f508990a3e9", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/controller-manager.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/controller-manager.yaml deleted file mode 100644 index c1946dd8bf..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/controller-manager.yaml +++ /dev/null @@ -1,1196 +0,0 @@ -{{- /* -Generated from 'controller-manager' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -{{- if (include "exporter.kubeControllerManager.enabled" .)}} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "controller-manager" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - controller-manager.json: |- - { - "__inputs": [ - - ], - "__requires": [ - - ], - "annotations": { - "list": [ - - ] - }, - "editable": false, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "id": null, - "links": [ - - ], - "refresh": "10s", - "rows": [ - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "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": { - - }, - "id": 2, - "interval": "1m", - "legend": { - "alignAsTable": true, - "rightSide": true - }, - "links": [ - - ], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "span": 2, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - {{- if .Values.k3sServer.enabled }} - "expr": "sum(up{cluster=\"$cluster\", job=\"{{ include "exporter.kubeControllerManager.jobName" . }}\", metrics_path=\"/metrics\"})", - {{- else }} - "expr": "sum(up{cluster=\"$cluster\", job=\"{{ include "exporter.kubeControllerManager.jobName" . }}\"})", - {{- end }} - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "", - "title": "Up", - "tooltip": { - "shared": false - }, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "min" - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 3, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(workqueue_adds_total{cluster=\"$cluster\", job=\"{{ include "exporter.kubeControllerManager.jobName" . }}\", instance=~\"$instance\"}[$__rate_interval])) by (cluster, instance, name)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}} {{`{{`}}instance{{`}}`}} {{`{{`}}name{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Work Queue Add Rate", - "tooltip": { - "shared": false, - "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": null, - "show": true - }, - { - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 4, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(workqueue_depth{cluster=\"$cluster\", job=\"{{ include "exporter.kubeControllerManager.jobName" . }}\", instance=~\"$instance\"}[$__rate_interval])) by (cluster, instance, name)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}} {{`{{`}}instance{{`}}`}} {{`{{`}}name{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Work Queue Depth", - "tooltip": { - "shared": false, - "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 - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 5, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(workqueue_queue_duration_seconds_bucket{cluster=\"$cluster\", job=\"{{ include "exporter.kubeControllerManager.jobName" . }}\", instance=~\"$instance\"}[$__rate_interval])) by (cluster, instance, name, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}} {{`{{`}}instance{{`}}`}} {{`{{`}}name{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Work Queue Latency", - "tooltip": { - "shared": false, - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 6, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(rest_client_requests_total{job=\"{{ include "exporter.kubeControllerManager.jobName" . }}\", instance=~\"$instance\",code=~\"2..\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "2xx", - "refId": "A" - }, - { - "expr": "sum(rate(rest_client_requests_total{job=\"{{ include "exporter.kubeControllerManager.jobName" . }}\", instance=~\"$instance\",code=~\"3..\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "3xx", - "refId": "B" - }, - { - "expr": "sum(rate(rest_client_requests_total{job=\"{{ include "exporter.kubeControllerManager.jobName" . }}\", instance=~\"$instance\",code=~\"4..\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "4xx", - "refId": "C" - }, - { - "expr": "sum(rate(rest_client_requests_total{job=\"{{ include "exporter.kubeControllerManager.jobName" . }}\", instance=~\"$instance\",code=~\"5..\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "5xx", - "refId": "D" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Kube API Request Rate", - "tooltip": { - "shared": false, - "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": null, - "show": true - }, - { - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 7, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 8, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(rest_client_request_duration_seconds_bucket{cluster=\"$cluster\", job=\"{{ include "exporter.kubeControllerManager.jobName" . }}\", instance=~\"$instance\", verb=\"POST\"}[$__rate_interval])) by (verb, url, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}verb{{`}}`}} {{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Post Request Latency 99th Quantile", - "tooltip": { - "shared": false, - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 8, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(rest_client_request_duration_seconds_bucket{cluster=\"$cluster\", job=\"{{ include "exporter.kubeControllerManager.jobName" . }}\", instance=~\"$instance\", verb=\"GET\"}[$__rate_interval])) by (verb, url, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}verb{{`}}`}} {{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Get Request Latency 99th Quantile", - "tooltip": { - "shared": false, - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 9, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "process_resident_memory_bytes{cluster=\"$cluster\", job=\"{{ include "exporter.kubeControllerManager.jobName" . }}\",instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory", - "tooltip": { - "shared": false, - "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": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 10, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(process_cpu_seconds_total{cluster=\"$cluster\", job=\"{{ include "exporter.kubeControllerManager.jobName" . }}\",instance=~\"$instance\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU usage", - "tooltip": { - "shared": false, - "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 - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 11, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "go_goroutines{cluster=\"$cluster\", job=\"{{ include "exporter.kubeControllerManager.jobName" . }}\",instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Goroutines", - "tooltip": { - "shared": false, - "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 - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - } - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "kubernetes-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": "cluster", - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(up{job=\"{{ include "exporter.kubeControllerManager.jobName" . }}\"}, cluster)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "instance", - "options": [ - - ], - "query": "label_values(up{cluster=\"$cluster\", job=\"{{ include "exporter.kubeControllerManager.jobName" . }}\"}, instance)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Kubernetes / Controller Manager", - "uid": "72e0e05bef5099e5f049b05fdc429ed4", - "version": 0 - } -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/etcd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/etcd.yaml deleted file mode 100644 index 3956638cbe..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/etcd.yaml +++ /dev/null @@ -1,1229 +0,0 @@ -{{- /* -Generated from 'etcd' from https://raw.githubusercontent.com/etcd-io/etcd/main/contrib/mixin/mixin.libsonnet -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -{{- if (include "exporter.kubeEtcd.enabled" .)}} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "etcd" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - etcd.json: |- - { - "annotations": { - "list": [] - }, - "description": "etcd sample Grafana dashboard with Prometheus", - "editable": true, - "gnetId": null, - "hideControls": false, - "links": [], - "refresh": "10s", - "rows": [ - { - "collapse": false, - "editable": true, - "height": "250px", - "panels": [ - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "$datasource", - "editable": true, - "error": false, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "id": 28, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "span": 3, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "targets": [ - { - "expr": "sum(etcd_server_has_leader{job=\"$cluster\"})", - "intervalFactor": 2, - "legendFormat": "", - "metric": "etcd_server_has_leader", - "refId": "A", - "step": 20 - } - ], - "thresholds": "", - "title": "Up", - "type": "singlestat", - "valueFontSize": "200%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" - }, - { - "aliasColors": {}, - "bars": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fill": 0, - "id": 23, - "isNew": true, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "span": 5, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(grpc_server_started_total{job=\"$cluster\",grpc_type=\"unary\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "RPC Rate", - "metric": "grpc_server_started_total", - "refId": "A", - "step": 2 - }, - { - "expr": "sum(rate(grpc_server_handled_total{job=\"$cluster\",grpc_type=\"unary\",grpc_code=~\"Unknown|FailedPrecondition|ResourceExhausted|Internal|Unavailable|DataLoss|DeadlineExceeded\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "RPC Failed Rate", - "metric": "grpc_server_handled_total", - "refId": "B", - "step": 2 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "RPC Rate", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fill": 0, - "id": 41, - "isNew": true, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "span": 4, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(grpc_server_started_total{job=\"$cluster\",grpc_service=\"etcdserverpb.Watch\",grpc_type=\"bidi_stream\"}) - sum(grpc_server_handled_total{job=\"$cluster\",grpc_service=\"etcdserverpb.Watch\",grpc_type=\"bidi_stream\"})", - "intervalFactor": 2, - "legendFormat": "Watch Streams", - "metric": "grpc_server_handled_total", - "refId": "A", - "step": 4 - }, - { - "expr": "sum(grpc_server_started_total{job=\"$cluster\",grpc_service=\"etcdserverpb.Lease\",grpc_type=\"bidi_stream\"}) - sum(grpc_server_handled_total{job=\"$cluster\",grpc_service=\"etcdserverpb.Lease\",grpc_type=\"bidi_stream\"})", - "intervalFactor": 2, - "legendFormat": "Lease Streams", - "metric": "grpc_server_handled_total", - "refId": "B", - "step": 4 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Active Streams", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": "", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "showTitle": false, - "title": "Row" - }, - { - "collapse": false, - "editable": true, - "height": "250px", - "panels": [ - { - "aliasColors": {}, - "bars": false, - "datasource": "$datasource", - "decimals": null, - "editable": true, - "error": false, - "fill": 0, - "grid": {}, - "id": 1, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "etcd_mvcc_db_total_size_in_bytes{job=\"$cluster\"}", - "hide": false, - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} DB Size", - "metric": "", - "refId": "A", - "step": 4 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "DB Size", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fill": 0, - "grid": {}, - "id": 3, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 1, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "span": 4, - "stack": false, - "steppedLine": true, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(etcd_disk_wal_fsync_duration_seconds_bucket{job=\"$cluster\"}[$__rate_interval])) by (instance, le))", - "hide": false, - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} WAL fsync", - "metric": "etcd_disk_wal_fsync_duration_seconds_bucket", - "refId": "A", - "step": 4 - }, - { - "expr": "histogram_quantile(0.99, sum(rate(etcd_disk_backend_commit_duration_seconds_bucket{job=\"$cluster\"}[$__rate_interval])) by (instance, le))", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} DB fsync", - "metric": "etcd_disk_backend_commit_duration_seconds_bucket", - "refId": "B", - "step": 4 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Disk Sync Duration", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fill": 0, - "id": 29, - "isNew": true, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "process_resident_memory_bytes{job=\"$cluster\"}", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} Resident Memory", - "metric": "process_resident_memory_bytes", - "refId": "A", - "step": 4 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Memory", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "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 - } - ] - } - ], - "title": "New row" - }, - { - "collapse": false, - "editable": true, - "height": "250px", - "panels": [ - { - "aliasColors": {}, - "bars": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fill": 5, - "id": 22, - "isNew": true, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "span": 3, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "rate(etcd_network_client_grpc_received_bytes_total{job=\"$cluster\"}[$__rate_interval])", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} Client Traffic In", - "metric": "etcd_network_client_grpc_received_bytes_total", - "refId": "A", - "step": 4 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Client Traffic In", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "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": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fill": 5, - "id": 21, - "isNew": true, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "span": 3, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "rate(etcd_network_client_grpc_sent_bytes_total{job=\"$cluster\"}[$__rate_interval])", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} Client Traffic Out", - "metric": "etcd_network_client_grpc_sent_bytes_total", - "refId": "A", - "step": 4 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Client Traffic Out", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "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": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fill": 0, - "id": 20, - "isNew": true, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "span": 3, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(etcd_network_peer_received_bytes_total{job=\"$cluster\"}[$__rate_interval])) by (instance)", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} Peer Traffic In", - "metric": "etcd_network_peer_received_bytes_total", - "refId": "A", - "step": 4 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Peer Traffic In", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "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": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "datasource": "$datasource", - "decimals": null, - "editable": true, - "error": false, - "fill": 0, - "grid": {}, - "id": 16, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "span": 3, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(etcd_network_peer_sent_bytes_total{job=\"$cluster\"}[$__rate_interval])) by (instance)", - "hide": false, - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} Peer Traffic Out", - "metric": "etcd_network_peer_sent_bytes_total", - "refId": "A", - "step": 4 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Peer Traffic Out", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "Bps", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "title": "New row" - }, - { - "collapse": false, - "editable": true, - "height": "250px", - "panels": [ - { - "aliasColors": {}, - "bars": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fill": 0, - "id": 40, - "isNew": true, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(etcd_server_proposals_failed_total{job=\"$cluster\"}[$__rate_interval]))", - "intervalFactor": 2, - "legendFormat": "Proposal Failure Rate", - "metric": "etcd_server_proposals_failed_total", - "refId": "A", - "step": 2 - }, - { - "expr": "sum(etcd_server_proposals_pending{job=\"$cluster\"})", - "intervalFactor": 2, - "legendFormat": "Proposal Pending Total", - "metric": "etcd_server_proposals_pending", - "refId": "B", - "step": 2 - }, - { - "expr": "sum(rate(etcd_server_proposals_committed_total{job=\"$cluster\"}[$__rate_interval]))", - "intervalFactor": 2, - "legendFormat": "Proposal Commit Rate", - "metric": "etcd_server_proposals_committed_total", - "refId": "C", - "step": 2 - }, - { - "expr": "sum(rate(etcd_server_proposals_applied_total{job=\"$cluster\"}[$__rate_interval]))", - "intervalFactor": 2, - "legendFormat": "Proposal Apply Rate", - "refId": "D", - "step": 2 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Raft Proposals", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": "", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "datasource": "$datasource", - "decimals": 0, - "editable": true, - "error": false, - "fill": 0, - "id": 19, - "isNew": true, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "changes(etcd_server_leader_changes_seen_total{job=\"$cluster\"}[1d])", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} Total Leader Elections Per Day", - "metric": "etcd_server_leader_changes_seen_total", - "refId": "A", - "step": 2 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Total Leader Elections Per Day", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "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 - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "decimals": 0, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 28 - }, - "hiddenSeries": false, - "id": 42, - "isNew": true, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum by (instance, le) (rate(etcd_network_peer_round_trip_time_seconds_bucket{job=\"$cluster\"}[$__rate_interval])))", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} Peer round trip time", - "metric": "etcd_network_peer_round_trip_time_seconds_bucket", - "refId": "A", - "step": 2 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Peer round trip time", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:925", - "decimals": null, - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:926", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "title": "New row" - } - ], - "schemaVersion": 13, - "sharedCrosshair": false, - "style": "dark", - "tags": [ - "etcd-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - "text": "prod", - "value": "prod" - }, - "datasource": "$datasource", - "hide": {{ if (or .Values.grafana.sidecar.dashboards.multicluster.global.enabled .Values.grafana.sidecar.dashboards.multicluster.etcd.enabled) }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": "cluster", - "multi": false, - "name": "cluster", - "options": [], - "query": "label_values(etcd_server_has_leader, job)", - "refresh": 2, - "regex": "", - "sort": 2, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-15m", - "to": "now" - }, - "timepicker": { - "now": true, - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "etcd", - "uid": "c2f4e12cdf69feb95caa41a5a1b423d9", - "version": 215 - } -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/grafana-overview.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/grafana-overview.yaml deleted file mode 100644 index 2ed6ebcee0..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/grafana-overview.yaml +++ /dev/null @@ -1,635 +0,0 @@ -{{- /* -Generated from 'grafana-overview' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "grafana-overview" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - grafana-overview.json: |- - { - "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, - "gnetId": null, - "graphTooltip": 0, - "id": 3085, - "iteration": 1631554945276, - "links": [ - - ], - "panels": [ - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "mappings": [ - - ], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - - ] - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 0, - "y": 0 - }, - "id": 6, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "mean" - ], - "fields": "", - "values": false - }, - "text": { - - }, - "textMode": "auto" - }, - "pluginVersion": "8.1.3", - "targets": [ - { - "expr": "grafana_alerting_result_total{job=~\"$job\", instance=~\"$instance\", state=\"alerting\"}", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Firing Alerts", - "type": "stat" - }, - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "mappings": [ - - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - - ] - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 6, - "y": 0 - }, - "id": 8, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "mean" - ], - "fields": "", - "values": false - }, - "text": { - - }, - "textMode": "auto" - }, - "pluginVersion": "8.1.3", - "targets": [ - { - "expr": "sum(grafana_stat_totals_dashboard{job=~\"$job\", instance=~\"$instance\"})", - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Dashboards", - "type": "stat" - }, - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": { - "align": null, - "displayMode": "auto" - }, - "mappings": [ - - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - - ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 10, - "options": { - "showHeader": true - }, - "pluginVersion": "8.1.3", - "targets": [ - { - "expr": "grafana_build_info{job=~\"$job\", instance=~\"$instance\"}", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Build Info", - "transformations": [ - { - "id": "labelsToFields", - "options": { - - } - }, - { - "id": "organize", - "options": { - "excludeByName": { - "Time": true, - "Value": true, - "branch": true, - "container": true, - "goversion": true, - "namespace": true, - "pod": true, - "revision": true - }, - "indexByName": { - "Time": 7, - "Value": 11, - "branch": 4, - "container": 8, - "edition": 2, - "goversion": 6, - "instance": 1, - "job": 0, - "namespace": 9, - "pod": 10, - "revision": 5, - "version": 3 - }, - "renameByName": { - - } - } - } - ], - "type": "table" - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "links": [ - - ] - }, - "overrides": [ - - ] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 5 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.1.3", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum by (status_code) (irate(grafana_http_request_duration_seconds_count{job=~\"$job\", instance=~\"$instance\"}[1m])) ", - "interval": "", - "legendFormat": "{{`{{`}}status_code{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeRegions": [ - - ], - "timeShift": null, - "title": "RPS", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "$$hashKey": "object:157", - "format": "reqps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:158", - "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", - "fieldConfig": { - "defaults": { - "links": [ - - ] - }, - "overrides": [ - - ] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 5 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.1.3", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "exemplar": true, - "expr": "histogram_quantile(0.99, sum(irate(grafana_http_request_duration_seconds_bucket{instance=~\"$instance\", job=~\"$job\"}[$__rate_interval])) by (le)) * 1", - "interval": "", - "legendFormat": "99th Percentile", - "refId": "A" - }, - { - "exemplar": true, - "expr": "histogram_quantile(0.50, sum(irate(grafana_http_request_duration_seconds_bucket{instance=~\"$instance\", job=~\"$job\"}[$__rate_interval])) by (le)) * 1", - "interval": "", - "legendFormat": "50th Percentile", - "refId": "B" - }, - { - "exemplar": true, - "expr": "sum(irate(grafana_http_request_duration_seconds_sum{instance=~\"$instance\", job=~\"$job\"}[$__rate_interval])) * 1 / sum(irate(grafana_http_request_duration_seconds_count{instance=~\"$instance\", job=~\"$job\"}[$__rate_interval]))", - "interval": "", - "legendFormat": "Average", - "refId": "C" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeRegions": [ - - ], - "timeShift": null, - "title": "Request Latency", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "$$hashKey": "object:210", - "format": "ms", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:211", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "schemaVersion": 30, - "style": "dark", - "tags": [ - - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "description": null, - "error": null, - "hide": 0, - "includeAll": false, - "label": "Data Source", - "multi": false, - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "queryValue": "", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - }, - { - "allValue": ".*", - "current": { - "selected": false, - "text": [ - "default/grafana" - ], - "value": [ - "default/grafana" - ] - }, - "datasource": "$datasource", - "definition": "label_values(grafana_build_info, job)", - "description": null, - "error": null, - "hide": 0, - "includeAll": true, - "label": null, - "multi": true, - "name": "job", - "options": [ - - ], - "query": { - "query": "label_values(grafana_build_info, job)", - "refId": "Billing Admin-job-Variable-Query" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": "$datasource", - "definition": "label_values(grafana_build_info, instance)", - "description": null, - "error": null, - "hide": 0, - "includeAll": true, - "label": null, - "multi": true, - "name": "instance", - "options": [ - - ], - "query": { - "query": "label_values(grafana_build_info, instance)", - "refId": "Billing Admin-instance-Variable-Query" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Grafana Overview", - "uid": "6be0s85Mk", - "version": 2 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-coredns.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-coredns.yaml deleted file mode 100644 index 5d5840e024..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-coredns.yaml +++ /dev/null @@ -1,1530 +0,0 @@ -{{- /* Added manually, can be changed in-place. */ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled .Values.coreDns.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "k8s-coredns" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - k8s-coredns.json: |- - { - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "description": "A dashboard for the CoreDNS DNS server with updated metrics for version 1.7.0+. Based on the CoreDNS dashboard by buhay.", - "editable": true, - "gnetId": 12539, - "graphTooltip": 0, - "iteration": 1603798405693, - "links": [ - { - "icon": "external link", - "tags": [], - "targetBlank": true, - "title": "CoreDNS.io", - "type": "link", - "url": "https://coredns.io" - } - ], - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "grid": {}, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 0 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.2.0", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "total", - "yaxis": 2 - } - ], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(coredns_dns_request_count_total{job=\"coredns\",instance=~\"$instance\"}[5m])) by (proto) or\nsum(rate(coredns_dns_requests_total{job=\"coredns\",instance=~\"$instance\"}[5m])) by (proto)", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{"{{proto}}"}}", - "refId": "A", - "step": 60 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Requests (total)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "pps", - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "grid": {}, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 0 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.2.0", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "total", - "yaxis": 2 - }, - { - "alias": "other", - "yaxis": 2 - } - ], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(coredns_dns_request_type_count_total{job=\"coredns\",instance=~\"$instance\"}[5m])) by (type) or \nsum(rate(coredns_dns_requests_total{job=\"coredns\",instance=~\"$instance\"}[5m])) by (type)", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{"{{type}}"}}", - "refId": "A", - "step": 60 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Requests (by qtype)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "pps", - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "grid": {}, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 0 - }, - "hiddenSeries": false, - "id": 6, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.2.0", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "total", - "yaxis": 2 - } - ], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(coredns_dns_request_count_total{job=\"coredns\",instance=~\"$instance\"}[5m])) by (zone) or\nsum(rate(coredns_dns_requests_total{job=\"coredns\",instance=~\"$instance\"}[5m])) by (zone)", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{"{{zone}}"}}", - "refId": "A", - "step": 60 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Requests (by zone)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "pps", - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 7 - }, - "hiddenSeries": false, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.2.0", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "total", - "yaxis": 2 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(coredns_dns_request_do_count_total{job=\"coredns\",instance=~\"$instance\"}[5m])) or\nsum(rate(coredns_dns_do_requests_total{job=\"coredns\",instance=~\"$instance\"}[5m]))", - "interval": "", - "intervalFactor": 2, - "legendFormat": "DO", - "refId": "A", - "step": 40 - }, - { - "expr": "sum(rate(coredns_dns_request_count_total{job=\"coredns\",instance=~\"$instance\"}[5m])) or\nsum(rate(coredns_dns_requests_total{job=\"coredns\",instance=~\"$instance\"}[5m]))", - "interval": "", - "intervalFactor": 2, - "legendFormat": "total", - "refId": "B", - "step": 40 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Requests (DO bit)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "pps", - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "grid": {}, - "gridPos": { - "h": 7, - "w": 6, - "x": 12, - "y": 7 - }, - "hiddenSeries": false, - "id": 10, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.2.0", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "tcp:90", - "yaxis": 2 - }, - { - "alias": "tcp:99 ", - "yaxis": 2 - }, - { - "alias": "tcp:50", - "yaxis": 2 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(coredns_dns_request_size_bytes_bucket{job=\"coredns\",instance=~\"$instance\",proto=\"udp\"}[5m])) by (le,proto))", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{"{{proto}}"}}:99 ", - "refId": "A", - "step": 60 - }, - { - "expr": "histogram_quantile(0.90, sum(rate(coredns_dns_request_size_bytes_bucket{job=\"coredns\",instance=~\"$instance\",proto=\"udp\"}[5m])) by (le,proto))", - "intervalFactor": 2, - "legendFormat": "{{"{{proto}}"}}:90", - "refId": "B", - "step": 60 - }, - { - "expr": "histogram_quantile(0.50, sum(rate(coredns_dns_request_size_bytes_bucket{job=\"coredns\",instance=~\"$instance\",proto=\"udp\"}[5m])) by (le,proto))", - "intervalFactor": 2, - "legendFormat": "{{"{{proto}}"}}:50", - "refId": "C", - "step": 60 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Requests (size, udp)", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "grid": {}, - "gridPos": { - "h": 7, - "w": 6, - "x": 18, - "y": 7 - }, - "hiddenSeries": false, - "id": 12, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.2.0", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "tcp:90", - "yaxis": 1 - }, - { - "alias": "tcp:99 ", - "yaxis": 1 - }, - { - "alias": "tcp:50", - "yaxis": 1 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(coredns_dns_request_size_bytes_bucket{job=\"coredns\",instance=~\"$instance\",proto=\"tcp\"}[5m])) by (le,proto))", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{"{{proto}}"}}:99 ", - "refId": "A", - "step": 60 - }, - { - "expr": "histogram_quantile(0.90, sum(rate(coredns_dns_request_size_bytes_bucket{job=\"coredns\",instance=~\"$instance\",proto=\"tcp\"}[5m])) by (le,proto))", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{"{{proto}}"}}:90", - "refId": "B", - "step": 60 - }, - { - "expr": "histogram_quantile(0.50, sum(rate(coredns_dns_request_size_bytes_bucket{job=\"coredns\",instance=~\"$instance\",proto=\"tcp\"}[5m])) by (le,proto))", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{"{{proto}}"}}:50", - "refId": "C", - "step": 60 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Requests (size,tcp)", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 14 - }, - "hiddenSeries": false, - "id": 14, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.2.0", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(coredns_dns_response_rcode_count_total{job=\"coredns\",instance=~\"$instance\"}[5m])) by (rcode) or\nsum(rate(coredns_dns_responses_total{job=\"coredns\",instance=~\"$instance\"}[5m])) by (rcode)", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{"{{rcode}}"}}", - "refId": "A", - "step": 40 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Responses (by rcode)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "pps", - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 14 - }, - "hiddenSeries": false, - "id": 32, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.2.0", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(coredns_dns_request_duration_seconds_bucket{job=\"coredns\",instance=~\"$instance\"}[5m])) by (le, job))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "99%", - "refId": "A", - "step": 40 - }, - { - "expr": "histogram_quantile(0.90, sum(rate(coredns_dns_request_duration_seconds_bucket{job=\"coredns\",instance=~\"$instance\"}[5m])) by (le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "90%", - "refId": "B", - "step": 40 - }, - { - "expr": "histogram_quantile(0.50, sum(rate(coredns_dns_request_duration_seconds_bucket{job=\"coredns\",instance=~\"$instance\"}[5m])) by (le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "50%", - "refId": "C", - "step": 40 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Responses (duration)", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 21 - }, - "hiddenSeries": false, - "id": 18, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.2.0", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "udp:50%", - "yaxis": 1 - }, - { - "alias": "tcp:50%", - "yaxis": 2 - }, - { - "alias": "tcp:90%", - "yaxis": 2 - }, - { - "alias": "tcp:99%", - "yaxis": 2 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(coredns_dns_response_size_bytes_bucket{job=\"coredns\",instance=~\"$instance\",proto=\"udp\"}[5m])) by (le,proto)) ", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{"{{proto}}"}}:99%", - "refId": "A", - "step": 40 - }, - { - "expr": "histogram_quantile(0.90, sum(rate(coredns_dns_response_size_bytes_bucket{job=\"coredns\",instance=~\"$instance\",proto=\"udp\"}[5m])) by (le,proto)) ", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{"{{proto}}"}}:90%", - "refId": "B", - "step": 40 - }, - { - "expr": "histogram_quantile(0.50, sum(rate(coredns_dns_response_size_bytes_bucket{job=\"coredns\",instance=~\"$instance\",proto=\"udp\"}[5m])) by (le,proto)) ", - "hide": false, - "intervalFactor": 2, - "legendFormat": "{{"{{proto}}"}}:50%", - "metric": "", - "refId": "C", - "step": 40 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Responses (size, udp)", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 21 - }, - "hiddenSeries": false, - "id": 20, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.2.0", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "udp:50%", - "yaxis": 1 - }, - { - "alias": "tcp:50%", - "yaxis": 1 - }, - { - "alias": "tcp:90%", - "yaxis": 1 - }, - { - "alias": "tcp:99%", - "yaxis": 1 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(coredns_dns_response_size_bytes_bucket{job=\"coredns\",instance=~\"$instance\",proto=\"tcp\"}[5m])) by (le,proto)) ", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{"{{proto}}"}}:99%", - "refId": "A", - "step": 40 - }, - { - "expr": "histogram_quantile(0.90, sum(rate(coredns_dns_response_size_bytes_bucket{job=\"coredns\",instance=~\"$instance\",proto=\"tcp\"}[5m])) by (le,proto)) ", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{"{{proto}}"}}:90%", - "refId": "B", - "step": 40 - }, - { - "expr": "histogram_quantile(0.50, sum(rate(coredns_dns_response_size_bytes_bucket{job=\"coredns\",instance=~\"$instance\",proto=\"tcp\"}[5m])) by (le, proto)) ", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{"{{proto}}"}}:50%", - "metric": "", - "refId": "C", - "step": 40 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Responses (size, tcp)", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 28 - }, - "hiddenSeries": false, - "id": 22, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.2.0", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(coredns_cache_size{job=\"coredns\",instance=~\"$instance\"}) by (type) or\nsum(coredns_cache_entries{job=\"coredns\",instance=~\"$instance\"}) by (type)", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{"{{type}}"}}", - "refId": "A", - "step": 40 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Cache (size)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "decbytes", - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 28 - }, - "hiddenSeries": false, - "id": 24, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.2.0", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "misses", - "yaxis": 2 - } - ], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(coredns_cache_hits_total{job=\"coredns\",instance=~\"$instance\"}[5m])) by (type)", - "hide": false, - "intervalFactor": 2, - "legendFormat": "hits:{{"{{type}}"}}", - "refId": "A", - "step": 40 - }, - { - "expr": "sum(rate(coredns_cache_misses_total{job=\"coredns\",instance=~\"$instance\"}[5m])) by (type)", - "hide": false, - "intervalFactor": 2, - "legendFormat": "misses", - "refId": "B", - "step": 40 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Cache (hitrate)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "pps", - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": "10s", - "schemaVersion": 26, - "style": "dark", - "tags": [ - "dns", - "coredns" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "includeAll": false, - "label": "Data Source", - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "queryValue": "", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - }, - { - "allValue": ".*", - "current": { - "selected": true, - "text": "All", - "value": "$__all" - }, - "datasource": "$datasource", - "definition": "label_values(up{job=\"coredns\"}, instance)", - "hide": 0, - "includeAll": true, - "label": "Instance", - "multi": false, - "name": "instance", - "options": [], - "query": "label_values(up{job=\"coredns\"}, instance)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 3, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-3h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "CoreDNS", - "uid": "vkQ0UHxik", - "version": 2 - } -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-cluster.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-cluster.yaml deleted file mode 100644 index f7c0289912..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-cluster.yaml +++ /dev/null @@ -1,3088 +0,0 @@ -{{- /* -Generated from 'k8s-resources-cluster' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "k8s-resources-cluster" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - k8s-resources-cluster.json: |- - { - "annotations": { - "list": [ - - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "links": [ - - ], - "refresh": "10s", - "rows": [ - { - "collapse": false, - "height": "100px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "format": "percentunit", - "id": 1, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 2, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "cluster:node_cpu:ratio_rate5m{cluster=\"$cluster\"}", - "format": "time_series", - "instant": true, - "intervalFactor": 2, - "refId": "A" - } - ], - "thresholds": "70,80", - "timeFrom": null, - "timeShift": null, - "title": "CPU Utilisation", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "singlestat", - "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": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "format": "percentunit", - "id": 2, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 2, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(namespace_cpu:kube_pod_container_resource_requests:sum{cluster=\"$cluster\"}) / sum(kube_node_status_allocatable{job=\"kube-state-metrics\",resource=\"cpu\",cluster=\"$cluster\"})", - "format": "time_series", - "instant": true, - "intervalFactor": 2, - "refId": "A" - } - ], - "thresholds": "70,80", - "timeFrom": null, - "timeShift": null, - "title": "CPU Requests Commitment", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "singlestat", - "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": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "format": "percentunit", - "id": 3, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 2, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(namespace_cpu:kube_pod_container_resource_limits:sum{cluster=\"$cluster\"}) / sum(kube_node_status_allocatable{job=\"kube-state-metrics\",resource=\"cpu\",cluster=\"$cluster\"})", - "format": "time_series", - "instant": true, - "intervalFactor": 2, - "refId": "A" - } - ], - "thresholds": "70,80", - "timeFrom": null, - "timeShift": null, - "title": "CPU Limits Commitment", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "singlestat", - "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": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "format": "percentunit", - "id": 4, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 2, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "1 - sum(:node_memory_MemAvailable_bytes:sum{cluster=\"$cluster\"}) / sum(node_memory_MemTotal_bytes{job=\"node-exporter\",cluster=\"$cluster\"})", - "format": "time_series", - "instant": true, - "intervalFactor": 2, - "refId": "A" - } - ], - "thresholds": "70,80", - "timeFrom": null, - "timeShift": null, - "title": "Memory Utilisation", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "singlestat", - "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": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "format": "percentunit", - "id": 5, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 2, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(namespace_memory:kube_pod_container_resource_requests:sum{cluster=\"$cluster\"}) / sum(kube_node_status_allocatable{job=\"kube-state-metrics\",resource=\"memory\",cluster=\"$cluster\"})", - "format": "time_series", - "instant": true, - "intervalFactor": 2, - "refId": "A" - } - ], - "thresholds": "70,80", - "timeFrom": null, - "timeShift": null, - "title": "Memory Requests Commitment", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "singlestat", - "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": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "format": "percentunit", - "id": 6, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 2, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(namespace_memory:kube_pod_container_resource_limits:sum{cluster=\"$cluster\"}) / sum(kube_node_status_allocatable{job=\"kube-state-metrics\",resource=\"memory\",cluster=\"$cluster\"})", - "format": "time_series", - "instant": true, - "intervalFactor": 2, - "refId": "A" - } - ], - "thresholds": "70,80", - "timeFrom": null, - "timeShift": null, - "title": "Memory Limits Commitment", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "singlestat", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Headlines", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 7, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\"}) by (namespace)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Usage", - "tooltip": { - "shared": false, - "sort": 2, - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "CPU", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 8, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "Pods", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 0, - "link": true, - "linkTargetBlank": false, - "linkTooltip": "Drill down to pods", - "linkUrl": "d/85a562078cdf77779eaa1add43ccec1e/k8s-resources-namespace?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$__cell_1", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "Workloads", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 0, - "link": true, - "linkTargetBlank": false, - "linkTooltip": "Drill down to workloads", - "linkUrl": "d/a87fb0d919ec0ea5f6543124e16c42a5/k8s-resources-workloads-namespace?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$__cell_1", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Usage", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Requests", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Requests %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "CPU Limits", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Limits %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #G", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Namespace", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": true, - "linkTargetBlank": false, - "linkTooltip": "Drill down to pods", - "linkUrl": "d/85a562078cdf77779eaa1add43ccec1e/k8s-resources-namespace?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$__cell", - "pattern": "namespace", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "sum(kube_pod_owner{job=\"kube-state-metrics\", cluster=\"$cluster\"}) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "count(avg(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\"}) by (workload, namespace)) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\"}) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sum(namespace_cpu:kube_pod_container_resource_requests:sum{cluster=\"$cluster\"}) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\"}) by (namespace) / sum(namespace_cpu:kube_pod_container_resource_requests:sum{cluster=\"$cluster\"}) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - }, - { - "expr": "sum(namespace_cpu:kube_pod_container_resource_limits:sum{cluster=\"$cluster\"}) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "F", - "step": 10 - }, - { - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\"}) by (namespace) / sum(namespace_cpu:kube_pod_container_resource_limits:sum{cluster=\"$cluster\"}) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "G", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Quota", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "CPU Quota", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 9, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(container_memory_rss{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", container!=\"\"}) by (namespace)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory Usage (w/o cache)", - "tooltip": { - "shared": false, - "sort": 2, - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Memory", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 10, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "Pods", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 0, - "link": true, - "linkTargetBlank": false, - "linkTooltip": "Drill down to pods", - "linkUrl": "d/85a562078cdf77779eaa1add43ccec1e/k8s-resources-namespace?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$__cell_1", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "Workloads", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 0, - "link": true, - "linkTargetBlank": false, - "linkTooltip": "Drill down to workloads", - "linkUrl": "d/a87fb0d919ec0ea5f6543124e16c42a5/k8s-resources-workloads-namespace?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$__cell_1", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "Memory Usage", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Requests", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Requests %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Memory Limits", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Limits %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #G", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Namespace", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": true, - "linkTargetBlank": false, - "linkTooltip": "Drill down to pods", - "linkUrl": "d/85a562078cdf77779eaa1add43ccec1e/k8s-resources-namespace?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$__cell", - "pattern": "namespace", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "sum(kube_pod_owner{job=\"kube-state-metrics\", cluster=\"$cluster\"}) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "count(avg(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\"}) by (workload, namespace)) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sum(container_memory_rss{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", container!=\"\"}) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sum(namespace_memory:kube_pod_container_resource_requests:sum{cluster=\"$cluster\"}) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sum(container_memory_rss{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", container!=\"\"}) by (namespace) / sum(namespace_memory:kube_pod_container_resource_requests:sum{cluster=\"$cluster\"}) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - }, - { - "expr": "sum(namespace_memory:kube_pod_container_resource_limits:sum{cluster=\"$cluster\"}) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "F", - "step": 10 - }, - { - "expr": "sum(container_memory_rss{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", container!=\"\"}) by (namespace) / sum(namespace_memory:kube_pod_container_resource_limits:sum{cluster=\"$cluster\"}) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "G", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Requests by Namespace", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Memory Requests", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 11, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "Current Receive Bandwidth", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Current Transmit Bandwidth", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Rate of Received Packets", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Transmitted Packets", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Received Packets Dropped", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Transmitted Packets Dropped", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Namespace", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": true, - "linkTargetBlank": false, - "linkTooltip": "Drill down to pods", - "linkUrl": "d/85a562078cdf77779eaa1add43ccec1e/k8s-resources-namespace?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$__cell", - "pattern": "namespace", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "sum(irate(container_network_receive_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "sum(irate(container_network_transmit_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sum(irate(container_network_receive_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sum(irate(container_network_transmit_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sum(irate(container_network_receive_packets_dropped_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - }, - { - "expr": "sum(irate(container_network_transmit_packets_dropped_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "F", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Current Network Usage", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Current Network Usage", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 12, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Receive Bandwidth", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 13, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_transmit_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Transmit Bandwidth", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Bandwidth", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 14, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "avg(irate(container_network_receive_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Average Container Bandwidth by Namespace: Received", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 15, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "avg(irate(container_network_transmit_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Average Container Bandwidth by Namespace: Transmitted", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Average Container Bandwidth by Namespace", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 16, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 17, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_transmit_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Rate of Packets", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 18, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_packets_dropped_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets Dropped", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 19, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_transmit_packets_dropped_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets Dropped", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Rate of Packets Dropped", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "decimals": -1, - "fill": 10, - "id": 20, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "ceil(sum by(namespace) (rate(container_fs_reads_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", container!=\"\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]) + rate(container_fs_writes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval])))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "IOPS(Reads+Writes)", - "tooltip": { - "shared": false, - "sort": 2, - "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": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 21, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum by(namespace) (rate(container_fs_reads_bytes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", container!=\"\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]) + rate(container_fs_writes_bytes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}namespace{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "ThroughPut(Read+Write)", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Storage IO", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 22, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "sort": { - "col": 4, - "desc": true - }, - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "IOPS(Reads)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "IOPS(Writes)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "IOPS(Reads + Writes)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "Throughput(Read)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Throughput(Write)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Throughput(Read + Write)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Namespace", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": true, - "linkTargetBlank": false, - "linkTooltip": "Drill down to pods", - "linkUrl": "d/85a562078cdf77779eaa1add43ccec1e/k8s-resources-namespace?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$__cell", - "pattern": "namespace", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "sum by(namespace) (rate(container_fs_reads_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "sum by(namespace) (rate(container_fs_writes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sum by(namespace) (rate(container_fs_reads_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]) + rate(container_fs_writes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sum by(namespace) (rate(container_fs_reads_bytes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sum by(namespace) (rate(container_fs_writes_bytes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - }, - { - "expr": "sum by(namespace) (rate(container_fs_reads_bytes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]) + rate(container_fs_writes_bytes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "F", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Current Storage IO", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Storage IO - Distribution", - "titleSize": "h6" - } - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "kubernetes-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": null, - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(up{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\"}, cluster)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Kubernetes / Compute Resources / Cluster", - "uid": "efa86fd1d0c121a26444b636a3f509a8", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-namespace.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-namespace.yaml deleted file mode 100644 index 5570f9f4c7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-namespace.yaml +++ /dev/null @@ -1,2797 +0,0 @@ -{{- /* -Generated from 'k8s-resources-namespace' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "k8s-resources-namespace" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - k8s-resources-namespace.json: |- - { - "annotations": { - "list": [ - - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "links": [ - - ], - "refresh": "10s", - "rows": [ - { - "collapse": false, - "height": "100px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "format": "percentunit", - "id": 1, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 3, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}) / sum(kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"})", - "format": "time_series", - "instant": true, - "intervalFactor": 2, - "refId": "A" - } - ], - "thresholds": "70,80", - "timeFrom": null, - "timeShift": null, - "title": "CPU Utilisation (from requests)", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "singlestat", - "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": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "format": "percentunit", - "id": 2, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 3, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}) / sum(kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"})", - "format": "time_series", - "instant": true, - "intervalFactor": 2, - "refId": "A" - } - ], - "thresholds": "70,80", - "timeFrom": null, - "timeShift": null, - "title": "CPU Utilisation (from limits)", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "singlestat", - "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": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "format": "percentunit", - "id": 3, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 3, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(container_memory_working_set_bytes{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\", image!=\"\"}) / sum(kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"})", - "format": "time_series", - "instant": true, - "intervalFactor": 2, - "refId": "A" - } - ], - "thresholds": "70,80", - "timeFrom": null, - "timeShift": null, - "title": "Memory Utilisation (from requests)", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "singlestat", - "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": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "format": "percentunit", - "id": 4, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 3, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(container_memory_working_set_bytes{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\", image!=\"\"}) / sum(kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"})", - "format": "time_series", - "instant": true, - "intervalFactor": 2, - "refId": "A" - } - ], - "thresholds": "70,80", - "timeFrom": null, - "timeShift": null, - "title": "Memory Utilisation (from limits)", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "singlestat", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Headlines", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 5, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "quota - requests", - "color": "#F2495C", - "dashes": true, - "fill": 0, - "hiddenSeries": true, - "hideTooltip": true, - "legend": true, - "linewidth": 2, - "stack": false - }, - { - "alias": "quota - limits", - "color": "#FF9830", - "dashes": true, - "fill": 0, - "hiddenSeries": true, - "hideTooltip": true, - "legend": true, - "linewidth": 2, - "stack": false - } - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - }, - { - "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"requests.cpu\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "quota - requests", - "legendLink": null, - "step": 10 - }, - { - "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"limits.cpu\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "quota - limits", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Usage", - "tooltip": { - "shared": false, - "sort": 2, - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "CPU Usage", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 6, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "CPU Usage", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Requests", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Requests %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "CPU Limits", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Limits %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Pod", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": true, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "d/6581e46e4e5c7ba40a07646395ef7b23/k8s-resources-pod?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$namespace&var-pod=$__cell", - "pattern": "pod", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Quota", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "CPU Quota", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 7, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "quota - requests", - "color": "#F2495C", - "dashes": true, - "fill": 0, - "hiddenSeries": true, - "hideTooltip": true, - "legend": true, - "linewidth": 2, - "stack": false - }, - { - "alias": "quota - limits", - "color": "#FF9830", - "dashes": true, - "fill": 0, - "hiddenSeries": true, - "hideTooltip": true, - "legend": true, - "linewidth": 2, - "stack": false - } - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(container_memory_working_set_bytes{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}) by (pod)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - }, - { - "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"requests.memory\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "quota - requests", - "legendLink": null, - "step": 10 - }, - { - "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"limits.memory\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "quota - limits", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory Usage (w/o cache)", - "tooltip": { - "shared": false, - "sort": 2, - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Memory Usage", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 8, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "Memory Usage", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Requests", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Requests %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Memory Limits", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Limits %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Memory Usage (RSS)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Usage (Cache)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #G", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Usage (Swap)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #H", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Pod", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": true, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "d/6581e46e4e5c7ba40a07646395ef7b23/k8s-resources-pod?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$namespace&var-pod=$__cell", - "pattern": "pod", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "sum(container_memory_working_set_bytes{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\", image!=\"\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sum(container_memory_working_set_bytes{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\", image!=\"\"}) by (pod) / sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_limits{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sum(container_memory_working_set_bytes{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\", image!=\"\"}) by (pod) / sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_limits{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - }, - { - "expr": "sum(container_memory_rss{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "F", - "step": 10 - }, - { - "expr": "sum(container_memory_cache{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "G", - "step": 10 - }, - { - "expr": "sum(container_memory_swap{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "H", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory Quota", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Memory Quota", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 9, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "Current Receive Bandwidth", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Current Transmit Bandwidth", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Rate of Received Packets", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Transmitted Packets", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Received Packets Dropped", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Transmitted Packets Dropped", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Pod", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": true, - "linkTargetBlank": false, - "linkTooltip": "Drill down to pods", - "linkUrl": "d/6581e46e4e5c7ba40a07646395ef7b23/k8s-resources-pod?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$namespace&var-pod=$__cell", - "pattern": "pod", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "sum(irate(container_network_receive_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "sum(irate(container_network_transmit_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sum(irate(container_network_receive_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sum(irate(container_network_transmit_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sum(irate(container_network_receive_packets_dropped_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - }, - { - "expr": "sum(irate(container_network_transmit_packets_dropped_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "F", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Current Network Usage", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Current Network Usage", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 10, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Receive Bandwidth", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 11, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Transmit Bandwidth", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Bandwidth", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 12, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_packets_total{cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 13, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_transmit_packets_total{cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Rate of Packets", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 14, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_packets_dropped_total{cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets Dropped", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 15, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_transmit_packets_dropped_total{cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets Dropped", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Rate of Packets Dropped", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "decimals": -1, - "fill": 10, - "id": 16, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "ceil(sum by(pod) (rate(container_fs_reads_total{container!=\"\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]) + rate(container_fs_writes_total{container!=\"\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "IOPS(Reads+Writes)", - "tooltip": { - "shared": false, - "sort": 2, - "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": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 17, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum by(pod) (rate(container_fs_reads_bytes_total{container!=\"\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]) + rate(container_fs_writes_bytes_total{container!=\"\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "ThroughPut(Read+Write)", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Storage IO", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 18, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "sort": { - "col": 4, - "desc": true - }, - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "IOPS(Reads)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "IOPS(Writes)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "IOPS(Reads + Writes)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "Throughput(Read)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Throughput(Write)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Throughput(Read + Write)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Pod", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": true, - "linkTargetBlank": false, - "linkTooltip": "Drill down to pods", - "linkUrl": "d/6581e46e4e5c7ba40a07646395ef7b23/k8s-resources-pod?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$namespace&var-pod=$__cell", - "pattern": "pod", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "sum by(pod) (rate(container_fs_reads_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "sum by(pod) (rate(container_fs_writes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sum by(pod) (rate(container_fs_reads_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]) + rate(container_fs_writes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sum by(pod) (rate(container_fs_reads_bytes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sum by(pod) (rate(container_fs_writes_bytes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - }, - { - "expr": "sum by(pod) (rate(container_fs_reads_bytes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]) + rate(container_fs_writes_bytes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "F", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Current Storage IO", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Storage IO - Distribution", - "titleSize": "h6" - } - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "kubernetes-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": null, - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(up{job=\"kube-state-metrics\"}, cluster)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "namespace", - "options": [ - - ], - "query": "label_values(kube_namespace_status_phase{job=\"kube-state-metrics\", cluster=\"$cluster\"}, namespace)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Kubernetes / Compute Resources / Namespace (Pods)", - "uid": "85a562078cdf77779eaa1add43ccec1e", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-node.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-node.yaml deleted file mode 100644 index fc10e7f2d3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-node.yaml +++ /dev/null @@ -1,1026 +0,0 @@ -{{- /* -Generated from 'k8s-resources-node' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "k8s-resources-node" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - k8s-resources-node.json: |- - { - "annotations": { - "list": [ - - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "links": [ - - ], - "refresh": "10s", - "rows": [ - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 1, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "max capacity", - "color": "#F2495C", - "dashes": true, - "fill": 0, - "hiddenSeries": true, - "hideTooltip": true, - "legend": true, - "linewidth": 2, - "stack": false - } - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(kube_node_status_capacity{cluster=\"$cluster\", node=~\"$node\", resource=\"cpu\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "max capacity", - "legendLink": null, - "step": 10 - }, - { - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Usage", - "tooltip": { - "shared": false, - "sort": 2, - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "CPU Usage", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 2, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "CPU Usage", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Requests", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Requests %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "CPU Limits", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Limits %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Pod", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "pod", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", node=~\"$node\"}) by (pod) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", node=~\"$node\"}) by (pod) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Quota", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "CPU Quota", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 3, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "max capacity", - "color": "#F2495C", - "dashes": true, - "fill": 0, - "hiddenSeries": true, - "hideTooltip": true, - "legend": true, - "linewidth": 2, - "stack": false - } - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(kube_node_status_capacity{cluster=\"$cluster\", node=~\"$node\", resource=\"memory\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "max capacity", - "legendLink": null, - "step": 10 - }, - { - "expr": "sum(node_namespace_pod_container:container_memory_working_set_bytes{cluster=\"$cluster\", node=~\"$node\", container!=\"\"}) by (pod)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory Usage (w/o cache)", - "tooltip": { - "shared": false, - "sort": 2, - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Memory Usage", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 4, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "Memory Usage", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Requests", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Requests %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Memory Limits", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Limits %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Memory Usage (RSS)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Usage (Cache)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #G", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Usage (Swap)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #H", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Pod", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "pod", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "sum(node_namespace_pod_container:container_memory_working_set_bytes{cluster=\"$cluster\", node=~\"$node\",container!=\"\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sum(node_namespace_pod_container:container_memory_working_set_bytes{cluster=\"$cluster\", node=~\"$node\",container!=\"\"}) by (pod) / sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_limits{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sum(node_namespace_pod_container:container_memory_working_set_bytes{cluster=\"$cluster\", node=~\"$node\",container!=\"\"}) by (pod) / sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_limits{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - }, - { - "expr": "sum(node_namespace_pod_container:container_memory_rss{cluster=\"$cluster\", node=~\"$node\",container!=\"\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "F", - "step": 10 - }, - { - "expr": "sum(node_namespace_pod_container:container_memory_cache{cluster=\"$cluster\", node=~\"$node\",container!=\"\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "G", - "step": 10 - }, - { - "expr": "sum(node_namespace_pod_container:container_memory_swap{cluster=\"$cluster\", node=~\"$node\",container!=\"\"}) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "H", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory Quota", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Memory Quota", - "titleSize": "h6" - } - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "kubernetes-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": null, - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(up{job=\"kube-state-metrics\"}, cluster)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": null, - "multi": true, - "name": "node", - "options": [ - - ], - "query": "label_values(kube_node_info{cluster=\"$cluster\"}, node)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Kubernetes / Compute Resources / Node (Pods)", - "uid": "200ac8fdbfbb74b39aff88118e4d1c2c", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-pod.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-pod.yaml deleted file mode 100644 index 0b79931474..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-pod.yaml +++ /dev/null @@ -1,2469 +0,0 @@ -{{- /* -Generated from 'k8s-resources-pod' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "k8s-resources-pod" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - k8s-resources-pod.json: |- - { - "annotations": { - "list": [ - - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "links": [ - - ], - "refresh": "10s", - "rows": [ - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 1, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "requests", - "color": "#F2495C", - "fill": 0, - "hideTooltip": true, - "legend": true, - "linewidth": 2, - "stack": false - }, - { - "alias": "limits", - "color": "#FF9830", - "fill": 0, - "hideTooltip": true, - "legend": true, - "linewidth": 2, - "stack": false - } - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\", pod=\"$pod\", cluster=\"$cluster\"}) by (container)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}container{{`}}`}}", - "legendLink": null, - "step": 10 - }, - { - "expr": "sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", resource=\"cpu\"}\n)\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "requests", - "legendLink": null, - "step": 10 - }, - { - "expr": "sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", resource=\"cpu\"}\n)\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "limits", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Usage", - "tooltip": { - "shared": false, - "sort": 2, - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "CPU Usage", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 2, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(increase(container_cpu_cfs_throttled_periods_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", cluster=\"$cluster\"}[$__rate_interval])) by (container) /sum(increase(container_cpu_cfs_periods_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", cluster=\"$cluster\"}[$__rate_interval])) by (container)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}container{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - { - "colorMode": "critical", - "fill": true, - "line": true, - "op": "gt", - "value": 0.25, - "yaxis": "left" - } - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Throttling", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": 1, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "CPU Throttling", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 3, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "CPU Usage", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Requests", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Requests %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "CPU Limits", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Limits %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Container", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "container", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Quota", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "CPU Quota", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 4, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "requests", - "color": "#F2495C", - "dashes": true, - "fill": 0, - "hideTooltip": true, - "legend": true, - "linewidth": 2, - "stack": false - }, - { - "alias": "limits", - "color": "#FF9830", - "dashes": true, - "fill": 0, - "hideTooltip": true, - "legend": true, - "linewidth": 2, - "stack": false - } - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(container_memory_working_set_bytes{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", image!=\"\"}) by (container)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}container{{`}}`}}", - "legendLink": null, - "step": 10 - }, - { - "expr": "sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", resource=\"memory\"}\n)\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "requests", - "legendLink": null, - "step": 10 - }, - { - "expr": "sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", resource=\"memory\"}\n)\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "limits", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory Usage (WSS)", - "tooltip": { - "shared": false, - "sort": 2, - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Memory Usage", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 5, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "Memory Usage (WSS)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Requests", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Requests %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Memory Limits", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Limits %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Memory Usage (RSS)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Usage (Cache)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #G", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Usage (Swap)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #H", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Container", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "container", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "sum(container_memory_working_set_bytes{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", image!=\"\"}) by (container)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sum(container_memory_working_set_bytes{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", image!=\"\"}) by (container) / sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_limits{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sum(container_memory_working_set_bytes{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", image!=\"\"}) by (container) / sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_limits{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - }, - { - "expr": "sum(container_memory_rss{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container != \"\", container != \"POD\"}) by (container)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "F", - "step": 10 - }, - { - "expr": "sum(container_memory_cache{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container != \"\", container != \"POD\"}) by (container)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "G", - "step": 10 - }, - { - "expr": "sum(container_memory_swap{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container != \"\", container != \"POD\"}) by (container)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "H", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory Quota", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Memory Quota", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 6, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval])) by (pod)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Receive Bandwidth", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 7, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_transmit_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval])) by (pod)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Transmit Bandwidth", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Bandwidth", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 8, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval])) by (pod)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 9, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_transmit_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval])) by (pod)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Rate of Packets", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 10, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_packets_dropped_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval])) by (pod)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets Dropped", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 11, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_transmit_packets_dropped_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval])) by (pod)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets Dropped", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Rate of Packets Dropped", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "decimals": -1, - "fill": 10, - "id": 12, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "ceil(sum by(pod) (rate(container_fs_reads_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval])))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Reads", - "legendLink": null, - "step": 10 - }, - { - "expr": "ceil(sum by(pod) (rate(container_fs_writes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\",namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval])))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Writes", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "IOPS", - "tooltip": { - "shared": false, - "sort": 2, - "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": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 13, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum by(pod) (rate(container_fs_reads_bytes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Reads", - "legendLink": null, - "step": 10 - }, - { - "expr": "sum by(pod) (rate(container_fs_writes_bytes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Writes", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "ThroughPut", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Storage IO - Distribution(Pod - Read & Writes)", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "decimals": -1, - "fill": 10, - "id": 14, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "ceil(sum by(container) (rate(container_fs_reads_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}container{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "IOPS(Reads+Writes)", - "tooltip": { - "shared": false, - "sort": 2, - "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": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 15, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum by(container) (rate(container_fs_reads_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}container{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "ThroughPut(Read+Write)", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Storage IO - Distribution(Containers)", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 16, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "sort": { - "col": 4, - "desc": true - }, - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "IOPS(Reads)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "IOPS(Writes)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "IOPS(Reads + Writes)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "Throughput(Read)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Throughput(Write)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Throughput(Read + Write)", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Container", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "container", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "sum by(container) (rate(container_fs_reads_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "sum by(container) (rate(container_fs_writes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\",device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sum by(container) (rate(container_fs_reads_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sum by(container) (rate(container_fs_reads_bytes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sum by(container) (rate(container_fs_writes_bytes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - }, - { - "expr": "sum by(container) (rate(container_fs_reads_bytes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_bytes_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "F", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Current Storage IO", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Storage IO - Distribution", - "titleSize": "h6" - } - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "kubernetes-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": null, - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(up{job=\"kube-state-metrics\"}, cluster)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "namespace", - "options": [ - - ], - "query": "label_values(kube_namespace_status_phase{job=\"kube-state-metrics\", cluster=\"$cluster\"}, namespace)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "pod", - "options": [ - - ], - "query": "label_values(kube_pod_info{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\"}, pod)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Kubernetes / Compute Resources / Pod", - "uid": "6581e46e4e5c7ba40a07646395ef7b23", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-workload.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-workload.yaml deleted file mode 100644 index 7b19154c52..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-workload.yaml +++ /dev/null @@ -1,2024 +0,0 @@ -{{- /* -Generated from 'k8s-resources-workload' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "k8s-resources-workload" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - k8s-resources-workload.json: |- - { - "annotations": { - "list": [ - - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "links": [ - - ], - "refresh": "10s", - "rows": [ - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 1, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\n) by (pod)\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Usage", - "tooltip": { - "shared": false, - "sort": 2, - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "CPU Usage", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 2, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "CPU Usage", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Requests", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Requests %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "CPU Limits", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Limits %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Pod", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": true, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "d/6581e46e4e5c7ba40a07646395ef7b23/k8s-resources-pod?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$namespace&var-pod=$__cell", - "pattern": "pod", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\n) by (pod)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\n) by (pod)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\n) by (pod)\n/sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\n) by (pod)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\n) by (pod)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\n) by (pod)\n/sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\n) by (pod)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Quota", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "CPU Quota", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 3, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\n container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\n) by (pod)\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory Usage", - "tooltip": { - "shared": false, - "sort": 2, - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Memory Usage", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 4, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "Memory Usage", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Requests", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Requests %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Memory Limits", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Limits %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Pod", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": true, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "d/6581e46e4e5c7ba40a07646395ef7b23/k8s-resources-pod?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$namespace&var-pod=$__cell", - "pattern": "pod", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "sum(\n container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\n) by (pod)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\n) by (pod)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sum(\n container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\n) by (pod)\n/sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\n) by (pod)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\n) by (pod)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sum(\n container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\n) by (pod)\n/sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\n) by (pod)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory Quota", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Memory Quota", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 5, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "Current Receive Bandwidth", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Current Transmit Bandwidth", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Rate of Received Packets", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Transmitted Packets", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Received Packets Dropped", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Transmitted Packets Dropped", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Pod", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": true, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "d/6581e46e4e5c7ba40a07646395ef7b23/k8s-resources-pod?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$namespace&var-pod=$__cell", - "pattern": "pod", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "(sum(irate(container_network_receive_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "(sum(irate(container_network_transmit_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "(sum(irate(container_network_receive_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "(sum(irate(container_network_transmit_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "(sum(irate(container_network_receive_packets_dropped_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - }, - { - "expr": "(sum(irate(container_network_transmit_packets_dropped_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "F", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Current Network Usage", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Current Network Usage", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 6, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(irate(container_network_receive_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Receive Bandwidth", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 7, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(irate(container_network_transmit_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Transmit Bandwidth", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Bandwidth", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 8, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(avg(irate(container_network_receive_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Average Container Bandwidth by Pod: Received", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 9, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(avg(irate(container_network_transmit_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Average Container Bandwidth by Pod: Transmitted", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Average Container Bandwidth by Pod", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 10, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(irate(container_network_receive_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 11, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(irate(container_network_transmit_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Rate of Packets", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 12, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(irate(container_network_receive_packets_dropped_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets Dropped", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 13, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(irate(container_network_transmit_packets_dropped_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets Dropped", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Rate of Packets Dropped", - "titleSize": "h6" - } - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "kubernetes-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": null, - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(up{job=\"kube-state-metrics\"}, cluster)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "namespace", - "options": [ - - ], - "query": "label_values(kube_namespace_status_phase{job=\"kube-state-metrics\", cluster=\"$cluster\"}, namespace)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "type", - "options": [ - - ], - "query": "label_values(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\"}, workload_type)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "workload", - "options": [ - - ], - "query": "label_values(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}, workload)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Kubernetes / Compute Resources / Workload", - "uid": "a164a7f0339f99e89cea5cb47e9be617", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-workloads-namespace.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-workloads-namespace.yaml deleted file mode 100644 index c4a15829d6..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/k8s-resources-workloads-namespace.yaml +++ /dev/null @@ -1,2189 +0,0 @@ -{{- /* -Generated from 'k8s-resources-workloads-namespace' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "k8s-resources-workloads-namespace" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - k8s-resources-workloads-namespace.json: |- - { - "annotations": { - "list": [ - - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "links": [ - - ], - "refresh": "10s", - "rows": [ - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 1, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "quota - requests", - "color": "#F2495C", - "dashes": true, - "fill": 0, - "hiddenSeries": true, - "hideTooltip": true, - "legend": true, - "linewidth": 2, - "stack": false - }, - { - "alias": "quota - limits", - "color": "#FF9830", - "dashes": true, - "fill": 0, - "hiddenSeries": true, - "hideTooltip": true, - "legend": true, - "linewidth": 2, - "stack": false - } - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}\n) by (workload, workload_type)\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}workload{{`}}`}} - {{`{{`}}workload_type{{`}}`}}", - "legendLink": null, - "step": 10 - }, - { - "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"requests.cpu\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "quota - requests", - "legendLink": null, - "step": 10 - }, - { - "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"limits.cpu\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "quota - limits", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Usage", - "tooltip": { - "shared": false, - "sort": 2, - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "CPU Usage", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 2, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "Running Pods", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 0, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Usage", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Requests", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Requests %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "CPU Limits", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Limits %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Workload", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": true, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "d/a164a7f0339f99e89cea5cb47e9be617/k8s-resources-workload?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$namespace&var-workload=$__cell&var-type=$__cell_2", - "pattern": "workload", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "Workload Type", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "workload_type", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "count(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}) by (workload, workload_type)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}\n) by (workload, workload_type)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}\n) by (workload, workload_type)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}\n) by (workload, workload_type)\n/sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}\n) by (workload, workload_type)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}\n) by (workload, workload_type)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - }, - { - "expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}\n) by (workload, workload_type)\n/sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}\n) by (workload, workload_type)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "F", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Quota", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "CPU Quota", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 3, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "quota - requests", - "color": "#F2495C", - "dashes": true, - "fill": 0, - "hiddenSeries": true, - "hideTooltip": true, - "legend": true, - "linewidth": 2, - "stack": false - }, - { - "alias": "quota - limits", - "color": "#FF9830", - "dashes": true, - "fill": 0, - "hiddenSeries": true, - "hideTooltip": true, - "legend": true, - "linewidth": 2, - "stack": false - } - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\n container_memory_working_set_bytes{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}\n) by (workload, workload_type)\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}workload{{`}}`}} - {{`{{`}}workload_type{{`}}`}}", - "legendLink": null, - "step": 10 - }, - { - "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"requests.memory\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "quota - requests", - "legendLink": null, - "step": 10 - }, - { - "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"limits.memory\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "quota - limits", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory Usage", - "tooltip": { - "shared": false, - "sort": 2, - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Memory Usage", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 4, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "Running Pods", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 0, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "Memory Usage", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Requests", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Requests %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Memory Limits", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Limits %", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [ - - ], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Workload", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": true, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "d/a164a7f0339f99e89cea5cb47e9be617/k8s-resources-workload?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$namespace&var-workload=$__cell&var-type=$__cell_2", - "pattern": "workload", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "Workload Type", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "workload_type", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "count(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}) by (workload, workload_type)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "sum(\n container_memory_working_set_bytes{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}\n) by (workload, workload_type)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}\n) by (workload, workload_type)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sum(\n container_memory_working_set_bytes{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}\n) by (workload, workload_type)\n/sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}\n) by (workload, workload_type)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}\n) by (workload, workload_type)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - }, - { - "expr": "sum(\n container_memory_working_set_bytes{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}\n) by (workload, workload_type)\n/sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}\n) by (workload, workload_type)\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "F", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory Quota", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Memory Quota", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 5, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "Current Receive Bandwidth", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Current Transmit Bandwidth", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Rate of Received Packets", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Transmitted Packets", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Received Packets Dropped", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Transmitted Packets Dropped", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Workload", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": true, - "linkTargetBlank": false, - "linkTooltip": "Drill down to pods", - "linkUrl": "d/a164a7f0339f99e89cea5cb47e9be617/k8s-resources-workload?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$namespace&var-workload=$__cell&var-type=$type", - "pattern": "workload", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "Workload Type", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "workload_type", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "(sum(irate(container_network_receive_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}) by (workload))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "(sum(irate(container_network_transmit_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}) by (workload))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "(sum(irate(container_network_receive_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}) by (workload))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "(sum(irate(container_network_transmit_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}) by (workload))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "(sum(irate(container_network_receive_packets_dropped_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}) by (workload))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - }, - { - "expr": "(sum(irate(container_network_transmit_packets_dropped_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=\"$type\"}) by (workload))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "F", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Current Network Usage", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Current Network Usage", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 6, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(irate(container_network_receive_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}workload{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Receive Bandwidth", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 7, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(irate(container_network_transmit_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}workload{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Transmit Bandwidth", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Bandwidth", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 8, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(avg(irate(container_network_receive_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}workload{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Average Container Bandwidth by Workload: Received", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 9, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(avg(irate(container_network_transmit_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}workload{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Average Container Bandwidth by Workload: Transmitted", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Average Container Bandwidth by Workload", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 10, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(irate(container_network_receive_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}workload{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 11, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(irate(container_network_transmit_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}workload{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Rate of Packets", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 12, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(irate(container_network_receive_packets_dropped_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}workload{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets Dropped", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 13, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(sum(irate(container_network_transmit_packets_dropped_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}workload{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets Dropped", - "tooltip": { - "shared": false, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Rate of Packets Dropped", - "titleSize": "h6" - } - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "kubernetes-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": null, - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(up{job=\"kube-state-metrics\"}, cluster)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "namespace", - "options": [ - - ], - "query": "label_values(kube_pod_info{job=\"kube-state-metrics\", cluster=\"$cluster\"}, namespace)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "deployment", - "value": "deployment" - }, - "datasource": "$datasource", - "definition": "label_values(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\".+\"}, workload_type)", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "type", - "options": [ - - ], - "query": "label_values(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\".+\"}, workload_type)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Kubernetes / Compute Resources / Namespace (Workloads)", - "uid": "a87fb0d919ec0ea5f6543124e16c42a5", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/kubelet.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/kubelet.yaml deleted file mode 100644 index 11c0934a39..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/kubelet.yaml +++ /dev/null @@ -1,2256 +0,0 @@ -{{- /* -Generated from 'kubelet' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -{{- if (include "exporter.kubelet.enabled" .) }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "kubelet" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - kubelet.json: |- - { - "__inputs": [ - - ], - "__requires": [ - - ], - "annotations": { - "list": [ - - ] - }, - "editable": false, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "id": null, - "links": [ - - ], - "panels": [ - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "links": [ - - ], - "mappings": [ - - ], - "thresholds": { - "mode": "absolute", - "steps": [ - - ] - }, - "unit": "none" - } - }, - "gridPos": { - "h": 7, - "w": 4, - "x": 0, - "y": 0 - }, - "id": 2, - "links": [ - - ], - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "7", - "targets": [ - { - "expr": "sum(kubelet_node_name{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "", - "refId": "A" - } - ], - "title": "Running Kubelets", - "transparent": false, - "type": "stat" - }, - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "links": [ - - ], - "mappings": [ - - ], - "thresholds": { - "mode": "absolute", - "steps": [ - - ] - }, - "unit": "none" - } - }, - "gridPos": { - "h": 7, - "w": 4, - "x": 4, - "y": 0 - }, - "id": 3, - "links": [ - - ], - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "7", - "targets": [ - { - "expr": "sum(kubelet_running_pods{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", instance=~\"$instance\"}) OR sum(kubelet_running_pod_count{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", instance=~\"$instance\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "title": "Running Pods", - "transparent": false, - "type": "stat" - }, - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "links": [ - - ], - "mappings": [ - - ], - "thresholds": { - "mode": "absolute", - "steps": [ - - ] - }, - "unit": "none" - } - }, - "gridPos": { - "h": 7, - "w": 4, - "x": 8, - "y": 0 - }, - "id": 4, - "links": [ - - ], - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "7", - "targets": [ - { - "expr": "sum(kubelet_running_containers{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", instance=~\"$instance\"}) OR sum(kubelet_running_container_count{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", instance=~\"$instance\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "title": "Running Containers", - "transparent": false, - "type": "stat" - }, - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "links": [ - - ], - "mappings": [ - - ], - "thresholds": { - "mode": "absolute", - "steps": [ - - ] - }, - "unit": "none" - } - }, - "gridPos": { - "h": 7, - "w": 4, - "x": 12, - "y": 0 - }, - "id": 5, - "links": [ - - ], - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "7", - "targets": [ - { - "expr": "sum(volume_manager_total_volumes{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", instance=~\"$instance\", state=\"actual_state_of_world\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "title": "Actual Volume Count", - "transparent": false, - "type": "stat" - }, - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "links": [ - - ], - "mappings": [ - - ], - "thresholds": { - "mode": "absolute", - "steps": [ - - ] - }, - "unit": "none" - } - }, - "gridPos": { - "h": 7, - "w": 4, - "x": 16, - "y": 0 - }, - "id": 6, - "links": [ - - ], - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "7", - "targets": [ - { - "expr": "sum(volume_manager_total_volumes{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", instance=~\"$instance\",state=\"desired_state_of_world\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "title": "Desired Volume Count", - "transparent": false, - "type": "stat" - }, - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "links": [ - - ], - "mappings": [ - - ], - "thresholds": { - "mode": "absolute", - "steps": [ - - ] - }, - "unit": "none" - } - }, - "gridPos": { - "h": 7, - "w": 4, - "x": 20, - "y": 0 - }, - "id": 7, - "links": [ - - ], - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "7", - "targets": [ - { - "expr": "sum(rate(kubelet_node_config_error{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", instance=~\"$instance\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "title": "Config Error Count", - "transparent": false, - "type": "stat" - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 7 - }, - "id": 8, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(kubelet_runtime_operations_total{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\",instance=~\"$instance\"}[$__rate_interval])) by (operation_type, instance)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} {{`{{`}}operation_type{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Operation Rate", - "tooltip": { - "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": null, - "show": true - }, - { - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 7 - }, - "id": 9, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(kubelet_runtime_operations_errors_total{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\",instance=~\"$instance\"}[$__rate_interval])) by (instance, operation_type)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} {{`{{`}}operation_type{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Operation Error Rate", - "tooltip": { - "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": null, - "show": true - }, - { - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 14 - }, - "id": 10, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(kubelet_runtime_operations_duration_seconds_bucket{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\",instance=~\"$instance\"}[$__rate_interval])) by (instance, operation_type, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} {{`{{`}}operation_type{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Operation duration 99th quantile", - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 21 - }, - "id": 11, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(kubelet_pod_start_duration_seconds_count{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\",instance=~\"$instance\"}[$__rate_interval])) by (instance)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} pod", - "refId": "A" - }, - { - "expr": "sum(rate(kubelet_pod_worker_duration_seconds_count{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\",instance=~\"$instance\"}[$__rate_interval])) by (instance)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} worker", - "refId": "B" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Pod Start Rate", - "tooltip": { - "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": null, - "show": true - }, - { - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 21 - }, - "id": 12, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(kubelet_pod_start_duration_seconds_bucket{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\",instance=~\"$instance\"}[$__rate_interval])) by (instance, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} pod", - "refId": "A" - }, - { - "expr": "histogram_quantile(0.99, sum(rate(kubelet_pod_worker_duration_seconds_bucket{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\",instance=~\"$instance\"}[$__rate_interval])) by (instance, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} worker", - "refId": "B" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Pod Start Duration", - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 28 - }, - "id": 13, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(storage_operation_duration_seconds_count{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\",instance=~\"$instance\"}[$__rate_interval])) by (instance, operation_name, volume_plugin)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} {{`{{`}}operation_name{{`}}`}} {{`{{`}}volume_plugin{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Storage Operation Rate", - "tooltip": { - "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": null, - "show": true - }, - { - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 28 - }, - "id": 14, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(storage_operation_errors_total{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\",instance=~\"$instance\"}[$__rate_interval])) by (instance, operation_name, volume_plugin)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} {{`{{`}}operation_name{{`}}`}} {{`{{`}}volume_plugin{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Storage Operation Error Rate", - "tooltip": { - "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": null, - "show": true - }, - { - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 35 - }, - "id": 15, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(storage_operation_duration_seconds_bucket{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", instance=~\"$instance\"}[$__rate_interval])) by (instance, operation_name, volume_plugin, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} {{`{{`}}operation_name{{`}}`}} {{`{{`}}volume_plugin{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Storage Operation Duration 99th quantile", - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 42 - }, - "id": 16, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(kubelet_cgroup_manager_duration_seconds_count{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", instance=~\"$instance\"}[$__rate_interval])) by (instance, operation_type)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}operation_type{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Cgroup manager operation rate", - "tooltip": { - "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": null, - "show": true - }, - { - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 42 - }, - "id": 17, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(kubelet_cgroup_manager_duration_seconds_bucket{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", instance=~\"$instance\"}[$__rate_interval])) by (instance, operation_type, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} {{`{{`}}operation_type{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Cgroup manager 99th quantile", - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "description": "Pod lifecycle event generator", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 49 - }, - "id": 18, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(kubelet_pleg_relist_duration_seconds_count{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", instance=~\"$instance\"}[$__rate_interval])) by (instance)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "PLEG relist rate", - "tooltip": { - "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": null, - "show": true - }, - { - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 49 - }, - "id": 19, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(kubelet_pleg_relist_interval_seconds_bucket{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\",instance=~\"$instance\"}[$__rate_interval])) by (instance, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "PLEG relist 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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 20, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(kubelet_pleg_relist_duration_seconds_bucket{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\",instance=~\"$instance\"}[$__rate_interval])) by (instance, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "PLEG relist duration", - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 63 - }, - "id": 21, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(rest_client_requests_total{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", instance=~\"$instance\",code=~\"2..\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "2xx", - "refId": "A" - }, - { - "expr": "sum(rate(rest_client_requests_total{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", instance=~\"$instance\",code=~\"3..\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "3xx", - "refId": "B" - }, - { - "expr": "sum(rate(rest_client_requests_total{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", instance=~\"$instance\",code=~\"4..\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "4xx", - "refId": "C" - }, - { - "expr": "sum(rate(rest_client_requests_total{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", instance=~\"$instance\",code=~\"5..\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "5xx", - "refId": "D" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "RPC Rate", - "tooltip": { - "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": null, - "show": true - }, - { - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 70 - }, - "id": 22, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(rest_client_request_duration_seconds_bucket{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", instance=~\"$instance\"}[$__rate_interval])) by (instance, verb, url, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} {{`{{`}}verb{{`}}`}} {{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Request duration 99th quantile", - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 77 - }, - "id": 23, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "process_resident_memory_bytes{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\",instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory", - "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": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 77 - }, - "id": 24, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(process_cpu_seconds_total{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\",instance=~\"$instance\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU usage", - "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 - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 77 - }, - "id": 25, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "go_goroutines{cluster=\"$cluster\",job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\",instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Goroutines", - "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 - } - ] - } - ], - "refresh": "10s", - "rows": [ - - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "kubernetes-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": "cluster", - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(up{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\"}, cluster)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": true, - "label": "instance", - "multi": false, - "name": "instance", - "options": [ - - ], - "query": "label_values(up{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\",cluster=\"$cluster\"}, instance)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Kubernetes / Kubelet", - "uid": "3138fa155d5915769fbded898ac09fd9", - "version": 0 - } -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/namespace-by-pod.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/namespace-by-pod.yaml deleted file mode 100644 index e84fcae946..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/namespace-by-pod.yaml +++ /dev/null @@ -1,1464 +0,0 @@ -{{- /* -Generated from 'namespace-by-pod' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "namespace-by-pod" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - namespace-by-pod.json: |- - { - "__inputs": [ - - ], - "__requires": [ - - ], - "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, - "hideControls": false, - "id": null, - "links": [ - - ], - "panels": [ - { - "collapse": false, - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 2, - "panels": [ - - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Current Bandwidth", - "titleSize": "h6", - "type": "row" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "$datasource", - "decimals": 0, - "format": "time_series", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 1 - }, - "height": 9, - "id": 3, - "interval": null, - "links": [ - - ], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "minSpan": 12, - "nullPointMode": "connected", - "nullText": null, - "options": { - "fieldOptions": { - "calcs": [ - "last" - ], - "defaults": { - "max": 10000000000, - "min": 0, - "title": "$namespace", - "unit": "Bps" - }, - "mappings": [ - - ], - "override": { - - }, - "thresholds": [ - { - "color": "dark-green", - "index": 0, - "value": null - }, - { - "color": "dark-yellow", - "index": 1, - "value": 5000000000 - }, - { - "color": "dark-red", - "index": 2, - "value": 7000000000 - } - ], - "values": false - } - }, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "span": 12, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution]))", - "format": "time_series", - "instant": null, - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": null, - "timeShift": null, - "title": "Current Rate of Bytes Received", - "type": "gauge", - "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", - "decimals": 0, - "format": "time_series", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 1 - }, - "height": 9, - "id": 4, - "interval": null, - "links": [ - - ], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "minSpan": 12, - "nullPointMode": "connected", - "nullText": null, - "options": { - "fieldOptions": { - "calcs": [ - "last" - ], - "defaults": { - "max": 10000000000, - "min": 0, - "title": "$namespace", - "unit": "Bps" - }, - "mappings": [ - - ], - "override": { - - }, - "thresholds": [ - { - "color": "dark-green", - "index": 0, - "value": null - }, - { - "color": "dark-yellow", - "index": 1, - "value": 5000000000 - }, - { - "color": "dark-red", - "index": 2, - "value": 7000000000 - } - ], - "values": false - } - }, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "span": 12, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution]))", - "format": "time_series", - "instant": null, - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": null, - "timeShift": null, - "title": "Current Rate of Bytes Transmitted", - "type": "gauge", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "columns": [ - { - "text": "Time", - "value": "Time" - }, - { - "text": "Value #A", - "value": "Value #A" - }, - { - "text": "Value #B", - "value": "Value #B" - }, - { - "text": "Value #C", - "value": "Value #C" - }, - { - "text": "Value #D", - "value": "Value #D" - }, - { - "text": "Value #E", - "value": "Value #E" - }, - { - "text": "Value #F", - "value": "Value #F" - }, - { - "text": "pod", - "value": "pod" - } - ], - "datasource": "$datasource", - "fill": 1, - "fontSize": "100%", - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 10 - }, - "id": 5, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "null as zero", - "renderer": "flot", - "scroll": true, - "showHeader": true, - "sort": { - "col": 0, - "desc": false - }, - "spaceLength": 10, - "span": 24, - "styles": [ - { - "alias": "Time", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Time", - "thresholds": [ - - ], - "type": "hidden", - "unit": "short" - }, - { - "alias": "Bandwidth Received", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Bandwidth Transmitted", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Rate of Received Packets", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Transmitted Packets", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Received Packets Dropped", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Transmitted Packets Dropped", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Pod", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": true, - "linkTooltip": "Drill down", - "linkUrl": "d/7a18067ce943a40ae25454675c19ff5c/kubernetes-networking-pod?orgId=1&refresh=30s&var-namespace=$namespace&var-pod=$__cell", - "pattern": "pod", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - } - ], - "targets": [ - { - "expr": "sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sum(irate(container_network_receive_packets_total{cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sum(irate(container_network_transmit_packets_total{cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sum(irate(container_network_receive_packets_dropped_total{cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - }, - { - "expr": "sum(irate(container_network_transmit_packets_dropped_total{cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])) by (pod)", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "F", - "step": 10 - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Current Status", - "type": "table" - }, - { - "collapse": false, - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 19 - }, - "id": 6, - "panels": [ - - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Bandwidth", - "titleSize": "h6", - "type": "row" - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 20 - }, - "id": 7, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])) by (pod)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Receive Bandwidth", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 20 - }, - "id": 8, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])) by (pod)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Transmit Bandwidth", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "collapse": true, - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 29 - }, - "id": 9, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 30 - }, - "id": 10, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_packets_total{cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])) by (pod)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 30 - }, - "id": 11, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_transmit_packets_total{cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])) by (pod)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Packets", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": true, - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 30 - }, - "id": 12, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 13, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_packets_dropped_total{cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])) by (pod)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets Dropped", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 14, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_transmit_packets_dropped_total{cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])) by (pod)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets Dropped", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Errors", - "titleSize": "h6", - "type": "row" - } - ], - "refresh": "10s", - "rows": [ - - ], - "schemaVersion": 18, - "style": "dark", - "tags": [ - "kubernetes-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": null, - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(up{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\"}, cluster)", - "refresh": 2, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".+", - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "kube-system", - "value": "kube-system" - }, - "datasource": "$datasource", - "definition": "label_values(container_network_receive_packets_total{cluster=\"$cluster\"}, namespace)", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "namespace", - "options": [ - - ], - "query": "label_values(container_network_receive_packets_total{cluster=\"$cluster\"}, namespace)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "5m", - "value": "5m" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "resolution", - "options": [ - { - "selected": false, - "text": "30s", - "value": "30s" - }, - { - "selected": true, - "text": "5m", - "value": "5m" - }, - { - "selected": false, - "text": "1h", - "value": "1h" - } - ], - "query": "30s,5m,1h", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "interval", - "useTags": false - }, - { - "allValue": null, - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "5m", - "value": "5m" - }, - "datasource": "$datasource", - "hide": 2, - "includeAll": false, - "label": null, - "multi": false, - "name": "interval", - "options": [ - { - "selected": true, - "text": "4h", - "value": "4h" - } - ], - "query": "4h", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "interval", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Kubernetes / Networking / Namespace (Pods)", - "uid": "8b7a8b326d7a6f1f04244066368c67af", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/namespace-by-workload.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/namespace-by-workload.yaml deleted file mode 100644 index 5490fe7f02..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/namespace-by-workload.yaml +++ /dev/null @@ -1,1736 +0,0 @@ -{{- /* -Generated from 'namespace-by-workload' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "namespace-by-workload" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - namespace-by-workload.json: |- - { - "__inputs": [ - - ], - "__requires": [ - - ], - "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, - "hideControls": false, - "id": null, - "links": [ - - ], - "panels": [ - { - "collapse": false, - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 2, - "panels": [ - - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Current Bandwidth", - "titleSize": "h6", - "type": "row" - }, - { - "aliasColors": { - - }, - "bars": true, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 1 - }, - "id": 3, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": false, - "linewidth": 1, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "null", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\",namespace=\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}} workload {{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Current Rate of Bytes Received", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "series", - "name": null, - "show": false, - "values": [ - "current" - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": true, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 1 - }, - "id": 4, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": false, - "linewidth": 1, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "null", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\",namespace=\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}} workload {{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Current Rate of Bytes Transmitted", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "series", - "name": null, - "show": false, - "values": [ - "current" - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "columns": [ - { - "text": "Time", - "value": "Time" - }, - { - "text": "Value #A", - "value": "Value #A" - }, - { - "text": "Value #B", - "value": "Value #B" - }, - { - "text": "Value #C", - "value": "Value #C" - }, - { - "text": "Value #D", - "value": "Value #D" - }, - { - "text": "Value #E", - "value": "Value #E" - }, - { - "text": "Value #F", - "value": "Value #F" - }, - { - "text": "Value #G", - "value": "Value #G" - }, - { - "text": "Value #H", - "value": "Value #H" - }, - { - "text": "workload", - "value": "workload" - } - ], - "datasource": "$datasource", - "fill": 1, - "fontSize": "90%", - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 10 - }, - "id": 5, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "null as zero", - "renderer": "flot", - "scroll": true, - "showHeader": true, - "sort": { - "col": 0, - "desc": false - }, - "spaceLength": 10, - "span": 24, - "styles": [ - { - "alias": "Time", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Time", - "thresholds": [ - - ], - "type": "hidden", - "unit": "short" - }, - { - "alias": "Current Bandwidth Received", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Current Bandwidth Transmitted", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Average Bandwidth Received", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Average Bandwidth Transmitted", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [ - - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Rate of Received Packets", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Transmitted Packets", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Received Packets Dropped", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #G", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Rate of Transmitted Packets Dropped", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #H", - "thresholds": [ - - ], - "type": "number", - "unit": "pps" - }, - { - "alias": "Workload", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": true, - "linkTooltip": "Drill down", - "linkUrl": "d/728bf77cc1166d2f3133bf25846876cc/kubernetes-networking-workload?orgId=1&refresh=30s&var-namespace=$namespace&var-type=$type&var-workload=$__cell", - "pattern": "workload", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - } - ], - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\",namespace=\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "sort_desc(sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\",namespace=\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - }, - { - "expr": "sort_desc(avg(irate(container_network_receive_bytes_total{cluster=\"$cluster\",namespace=\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "C", - "step": 10 - }, - { - "expr": "sort_desc(avg(irate(container_network_transmit_bytes_total{cluster=\"$cluster\",namespace=\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "D", - "step": 10 - }, - { - "expr": "sort_desc(sum(irate(container_network_receive_packets_total{cluster=\"$cluster\",namespace=\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "E", - "step": 10 - }, - { - "expr": "sort_desc(sum(irate(container_network_transmit_packets_total{cluster=\"$cluster\",namespace=\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "F", - "step": 10 - }, - { - "expr": "sort_desc(sum(irate(container_network_receive_packets_dropped_total{cluster=\"$cluster\",namespace=\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "G", - "step": 10 - }, - { - "expr": "sort_desc(sum(irate(container_network_transmit_packets_dropped_total{cluster=\"$cluster\",namespace=\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "H", - "step": 10 - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Current Status", - "type": "table" - }, - { - "collapse": true, - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 19 - }, - "id": 6, - "panels": [ - { - "aliasColors": { - - }, - "bars": true, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 20 - }, - "id": 7, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": false, - "linewidth": 1, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "null", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(avg(irate(container_network_receive_bytes_total{cluster=\"$cluster\",namespace=\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}} workload {{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Average Rate of Bytes Received", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "series", - "name": null, - "show": false, - "values": [ - "current" - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": true, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 20 - }, - "id": 8, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": false, - "linewidth": 1, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "null", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(avg(irate(container_network_transmit_bytes_total{cluster=\"$cluster\",namespace=\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}} workload {{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Average Rate of Bytes Transmitted", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "series", - "name": null, - "show": false, - "values": [ - "current" - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Average Bandwidth", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 29 - }, - "id": 9, - "panels": [ - - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Bandwidth HIstory", - "titleSize": "h6", - "type": "row" - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 38 - }, - "id": 10, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\",namespace=\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}workload{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Receive Bandwidth", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 38 - }, - "id": 11, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\",namespace=\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}workload{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Transmit Bandwidth", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "collapse": true, - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 39 - }, - "id": 12, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 13, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_receive_packets_total{cluster=\"$cluster\",namespace=\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}workload{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 14, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_transmit_packets_total{cluster=\"$cluster\",namespace=\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}workload{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Packets", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": true, - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 40 - }, - "id": 15, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 41 - }, - "id": 16, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_receive_packets_dropped_total{cluster=\"$cluster\",namespace=\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}workload{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets Dropped", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 41 - }, - "id": 17, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_transmit_packets_dropped_total{cluster=\"$cluster\",namespace=\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\", workload_type=\"$type\"}) by (workload))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}workload{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets Dropped", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Errors", - "titleSize": "h6", - "type": "row" - } - ], - "refresh": "10s", - "rows": [ - - ], - "schemaVersion": 18, - "style": "dark", - "tags": [ - "kubernetes-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": null, - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(up{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\"}, cluster)", - "refresh": 2, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "kube-system", - "value": "kube-system" - }, - "datasource": "$datasource", - "definition": "label_values(container_network_receive_packets_total{cluster=\"$cluster\"}, namespace)", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "namespace", - "options": [ - - ], - "query": "label_values(container_network_receive_packets_total{cluster=\"$cluster\"}, namespace)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "deployment", - "value": "deployment" - }, - "datasource": "$datasource", - "definition": "label_values(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\"}, workload_type)", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "type", - "options": [ - - ], - "query": "label_values(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=\"$namespace\", workload=~\".+\"}, workload_type)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "5m", - "value": "5m" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "resolution", - "options": [ - { - "selected": false, - "text": "30s", - "value": "30s" - }, - { - "selected": true, - "text": "5m", - "value": "5m" - }, - { - "selected": false, - "text": "1h", - "value": "1h" - } - ], - "query": "30s,5m,1h", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "interval", - "useTags": false - }, - { - "allValue": null, - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "5m", - "value": "5m" - }, - "datasource": "$datasource", - "hide": 2, - "includeAll": false, - "label": null, - "multi": false, - "name": "interval", - "options": [ - { - "selected": true, - "text": "4h", - "value": "4h" - } - ], - "query": "4h", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "interval", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Kubernetes / Networking / Namespace (Workload)", - "uid": "bbb2a765a623ae38130206c7d94a160f", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/node-cluster-rsrc-use.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/node-cluster-rsrc-use.yaml deleted file mode 100644 index afef8e35a5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/node-cluster-rsrc-use.yaml +++ /dev/null @@ -1,1063 +0,0 @@ -{{- /* -Generated from 'node-cluster-rsrc-use' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled .Values.nodeExporter.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "node-cluster-rsrc-use" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - node-cluster-rsrc-use.json: |- - { - "__inputs": [ - - ], - "__requires": [ - - ], - "annotations": { - "list": [ - - ] - }, - "editable": false, - "gnetId": null, - "graphTooltip": 1, - "hideControls": false, - "id": null, - "links": [ - - ], - "refresh": "30s", - "rows": [ - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 2, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "((\n instance:node_cpu_utilisation:rate5m{job=\"node-exporter\", cluster=\"$cluster\"}\n *\n instance:node_num_cpu:sum{job=\"node-exporter\", cluster=\"$cluster\"}\n) != 0 )\n/ scalar(sum(instance:node_num_cpu:sum{job=\"node-exporter\", cluster=\"$cluster\"}))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}} instance {{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Utilisation", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 3, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(\n instance:node_load1_per_cpu:ratio{job=\"node-exporter\", cluster=\"$cluster\"}\n / scalar(count(instance:node_load1_per_cpu:ratio{job=\"node-exporter\", cluster=\"$cluster\"}))\n) != 0\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Saturation (Load1 per CPU)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "CPU", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 4, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(\n instance:node_memory_utilisation:ratio{job=\"node-exporter\", cluster=\"$cluster\"}\n / scalar(count(instance:node_memory_utilisation:ratio{job=\"node-exporter\", cluster=\"$cluster\"}))\n) != 0\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory Utilisation", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 5, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "instance:node_vmstat_pgmajfault:rate5m{job=\"node-exporter\", cluster=\"$cluster\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory Saturation (Major Page Faults)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "rds", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "rds", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Memory", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 6, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - { - "alias": "/Receive/", - "stack": "A" - }, - { - "alias": "/Transmit/", - "stack": "B", - "transform": "negative-Y" - } - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "instance:node_network_receive_bytes_excluding_lo:rate5m{job=\"node-exporter\", cluster=\"$cluster\"} != 0", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} Receive", - "refId": "A" - }, - { - "expr": "instance:node_network_transmit_bytes_excluding_lo:rate5m{job=\"node-exporter\", cluster=\"$cluster\"} != 0", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} Transmit", - "refId": "B" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Network Utilisation (Bytes Receive/Transmit)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "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": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 7, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - { - "alias": "/ Receive/", - "stack": "A" - }, - { - "alias": "/ Transmit/", - "stack": "B", - "transform": "negative-Y" - } - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "instance:node_network_receive_drop_excluding_lo:rate5m{job=\"node-exporter\", cluster=\"$cluster\"} != 0", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} Receive", - "refId": "A" - }, - { - "expr": "instance:node_network_transmit_drop_excluding_lo:rate5m{job=\"node-exporter\", cluster=\"$cluster\"} != 0", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} Transmit", - "refId": "B" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Network Saturation (Drops Receive/Transmit)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "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": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Network", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 8, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(\n instance_device:node_disk_io_time_seconds:rate5m{job=\"node-exporter\", cluster=\"$cluster\"}\n / scalar(count(instance_device:node_disk_io_time_seconds:rate5m{job=\"node-exporter\", cluster=\"$cluster\"}))\n) != 0\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} {{`{{`}}device{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Disk IO Utilisation", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 9, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(\n instance_device:node_disk_io_time_weighted_seconds:rate5m{job=\"node-exporter\", cluster=\"$cluster\"}\n / scalar(count(instance_device:node_disk_io_time_weighted_seconds:rate5m{job=\"node-exporter\", cluster=\"$cluster\"}))\n) != 0\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}} {{`{{`}}device{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Disk IO Saturation", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Disk IO", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 10, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum without (device) (\n max without (fstype, mountpoint) ((\n node_filesystem_size_bytes{job=\"node-exporter\", fstype!=\"\", mountpoint!=\"\", cluster=\"$cluster\"}\n -\n node_filesystem_avail_bytes{job=\"node-exporter\", fstype!=\"\", mountpoint!=\"\", cluster=\"$cluster\"}\n ) != 0)\n)\n/ scalar(sum(max without (fstype, mountpoint) (node_filesystem_size_bytes{job=\"node-exporter\", fstype!=\"\", mountpoint!=\"\", cluster=\"$cluster\"})))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Disk Space Utilisation", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Disk Space", - "titleSize": "h6", - "type": "row" - } - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "node-exporter-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": null, - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(node_time_seconds, cluster)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Node Exporter / USE Method / Cluster", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/node-rsrc-use.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/node-rsrc-use.yaml deleted file mode 100644 index 561dcb93dd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/node-rsrc-use.yaml +++ /dev/null @@ -1,1089 +0,0 @@ -{{- /* -Generated from 'node-rsrc-use' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled .Values.nodeExporter.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "node-rsrc-use" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - node-rsrc-use.json: |- - { - "__inputs": [ - - ], - "__requires": [ - - ], - "annotations": { - "list": [ - - ] - }, - "editable": false, - "gnetId": null, - "graphTooltip": 1, - "hideControls": false, - "id": null, - "links": [ - - ], - "refresh": "30s", - "rows": [ - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 2, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "instance:node_cpu_utilisation:rate5m{job=\"node-exporter\", instance=\"$instance\", cluster=\"$cluster\"} != 0", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Utilisation", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Utilisation", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 3, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "instance:node_load1_per_cpu:ratio{job=\"node-exporter\", instance=\"$instance\", cluster=\"$cluster\"} != 0", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Saturation", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Saturation (Load1 per CPU)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "CPU", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 4, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "instance:node_memory_utilisation:ratio{job=\"node-exporter\", instance=\"$instance\", cluster=\"$cluster\"} != 0", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Utilisation", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory Utilisation", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 5, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "instance:node_vmstat_pgmajfault:rate5m{job=\"node-exporter\", instance=\"$instance\", cluster=\"$cluster\"} != 0", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Major page Faults", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory Saturation (Major Page Faults)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "rds", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "rds", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Memory", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 6, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - { - "alias": "/Receive/", - "stack": "A" - }, - { - "alias": "/Transmit/", - "stack": "B", - "transform": "negative-Y" - } - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "instance:node_network_receive_bytes_excluding_lo:rate5m{job=\"node-exporter\", instance=\"$instance\", cluster=\"$cluster\"} != 0", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Receive", - "refId": "A" - }, - { - "expr": "instance:node_network_transmit_bytes_excluding_lo:rate5m{job=\"node-exporter\", instance=\"$instance\", cluster=\"$cluster\"} != 0", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Transmit", - "refId": "B" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Network Utilisation (Bytes Receive/Transmit)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "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": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 7, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - { - "alias": "/ Receive/", - "stack": "A" - }, - { - "alias": "/ Transmit/", - "stack": "B", - "transform": "negative-Y" - } - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "instance:node_network_receive_drop_excluding_lo:rate5m{job=\"node-exporter\", instance=\"$instance\", cluster=\"$cluster\"} != 0", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Receive", - "refId": "A" - }, - { - "expr": "instance:node_network_transmit_drop_excluding_lo:rate5m{job=\"node-exporter\", instance=\"$instance\", cluster=\"$cluster\"} != 0", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Transmit", - "refId": "B" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Network Saturation (Drops Receive/Transmit)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "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": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Network", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 8, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "instance_device:node_disk_io_time_seconds:rate5m{job=\"node-exporter\", instance=\"$instance\", cluster=\"$cluster\"} != 0", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}device{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Disk IO Utilisation", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 9, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "instance_device:node_disk_io_time_weighted_seconds:rate5m{job=\"node-exporter\", instance=\"$instance\", cluster=\"$cluster\"} != 0", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}device{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Disk IO Saturation", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Disk IO", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "fillGradient": 0, - "gridPos": { - - }, - "id": 10, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(1 -\n (\n max without (mountpoint, fstype) (node_filesystem_avail_bytes{job=\"node-exporter\", fstype!=\"\", instance=\"$instance\", cluster=\"$cluster\"})\n /\n max without (mountpoint, fstype) (node_filesystem_size_bytes{job=\"node-exporter\", fstype!=\"\", instance=\"$instance\", cluster=\"$cluster\"})\n ) != 0\n)\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}device{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Disk Space Utilisation", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Disk Space", - "titleSize": "h6", - "type": "row" - } - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "node-exporter-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": null, - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(node_time_seconds, cluster)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "instance", - "options": [ - - ], - "query": "label_values(node_exporter_build_info{job=\"node-exporter\", cluster=\"$cluster\"}, instance)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Node Exporter / USE Method / Node", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/nodes-darwin.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/nodes-darwin.yaml deleted file mode 100644 index 624b8902ff..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/nodes-darwin.yaml +++ /dev/null @@ -1,1073 +0,0 @@ -{{- /* -Generated from 'nodes-darwin' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled .Values.nodeExporter.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "nodes-darwin" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - nodes-darwin.json: |- - { - "__inputs": [ - - ], - "__requires": [ - - ], - "annotations": { - "list": [ - - ] - }, - "editable": false, - "gnetId": null, - "graphTooltip": 1, - "hideControls": false, - "id": null, - "links": [ - - ], - "refresh": "30s", - "rows": [ - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 2, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(\n (1 - sum without (mode) (rate(node_cpu_seconds_total{job=\"node-exporter\", mode=~\"idle|iowait|steal\", instance=\"$instance\"}[$__rate_interval])))\n/ ignoring(cpu) group_left\n count without (cpu, mode) (node_cpu_seconds_total{job=\"node-exporter\", mode=\"idle\", instance=\"$instance\"})\n)\n", - "format": "time_series", - "intervalFactor": 5, - "legendFormat": "{{`{{`}}cpu{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": 1, - "min": 0, - "show": true - }, - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": 1, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 0, - "fillGradient": 0, - "gridPos": { - - }, - "id": 3, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "node_load1{job=\"node-exporter\", instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "1m load average", - "refId": "A" - }, - { - "expr": "node_load5{job=\"node-exporter\", instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "5m load average", - "refId": "B" - }, - { - "expr": "node_load15{job=\"node-exporter\", instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "15m load average", - "refId": "C" - }, - { - "expr": "count(node_cpu_seconds_total{job=\"node-exporter\", instance=\"$instance\", mode=\"idle\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "logical cores", - "refId": "D" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Load Average", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "CPU", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 4, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 9, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "node_memory_total_bytes{job=\"node-exporter\", instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Physical Memory", - "refId": "A" - }, - { - "expr": "(\n node_memory_internal_bytes{job=\"node-exporter\", instance=\"$instance\"} -\n node_memory_purgeable_bytes{job=\"node-exporter\", instance=\"$instance\"} +\n node_memory_wired_bytes{job=\"node-exporter\", instance=\"$instance\"} +\n node_memory_compressed_bytes{job=\"node-exporter\", instance=\"$instance\"}\n)\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Memory Used", - "refId": "B" - }, - { - "expr": "(\n node_memory_internal_bytes{job=\"node-exporter\", instance=\"$instance\"} -\n node_memory_purgeable_bytes{job=\"node-exporter\", instance=\"$instance\"}\n)\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "App Memory", - "refId": "C" - }, - { - "expr": "node_memory_wired_bytes{job=\"node-exporter\", instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Wired Memory", - "refId": "D" - }, - { - "expr": "node_memory_compressed_bytes{job=\"node-exporter\", instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Compressed", - "refId": "E" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory Usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "rgba(50, 172, 45, 0.97)" - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 80 - }, - { - "color": "rgba(245, 54, 54, 0.9)", - "value": 90 - } - ] - }, - "unit": "percent" - } - }, - "gridPos": { - - }, - "id": 5, - "span": 3, - "targets": [ - { - "expr": "(\n (\n avg(node_memory_internal_bytes{job=\"node-exporter\", instance=\"$instance\"}) -\n avg(node_memory_purgeable_bytes{job=\"node-exporter\", instance=\"$instance\"}) +\n avg(node_memory_wired_bytes{job=\"node-exporter\", instance=\"$instance\"}) +\n avg(node_memory_compressed_bytes{job=\"node-exporter\", instance=\"$instance\"})\n ) /\n avg(node_memory_total_bytes{job=\"node-exporter\", instance=\"$instance\"})\n)\n*\n100\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "" - } - ], - "title": "Memory Usage", - "transparent": false, - "type": "gauge" - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Memory", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 0, - "fillGradient": 0, - "gridPos": { - - }, - "id": 6, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - { - "alias": "/ read| written/", - "yaxis": 1 - }, - { - "alias": "/ io time/", - "yaxis": 2 - } - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(node_disk_read_bytes_total{job=\"node-exporter\", instance=\"$instance\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}device{{`}}`}} read", - "refId": "A" - }, - { - "expr": "rate(node_disk_written_bytes_total{job=\"node-exporter\", instance=\"$instance\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}device{{`}}`}} written", - "refId": "B" - }, - { - "expr": "rate(node_disk_io_time_seconds_total{job=\"node-exporter\", instance=\"$instance\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}device{{`}}`}} io time", - "refId": "C" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Disk I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "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": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": { - - }, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "yellow", - "value": 0.8 - }, - { - "color": "red", - "value": 0.9 - } - ] - }, - "unit": "decbytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Mounted on" - }, - "properties": [ - { - "id": "custom.width", - "value": 260 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Size" - }, - "properties": [ - { - "id": "custom.width", - "value": 93 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Used" - }, - "properties": [ - { - "id": "custom.width", - "value": 72 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Available" - }, - "properties": [ - { - "id": "custom.width", - "value": 88 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Used, %" - }, - "properties": [ - { - "id": "unit", - "value": "percentunit" - }, - { - "id": "custom.displayMode", - "value": "gradient-gauge" - }, - { - "id": "max", - "value": 1 - }, - { - "id": "min", - "value": 0 - } - ] - } - ] - }, - "gridPos": { - - }, - "id": 7, - "span": 6, - "targets": [ - { - "expr": "max by (mountpoint) (node_filesystem_size_bytes{job=\"node-exporter\", instance=\"$instance\", fstype!=\"\", mountpoint!=\"\"})\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "" - }, - { - "expr": "max by (mountpoint) (node_filesystem_avail_bytes{job=\"node-exporter\", instance=\"$instance\", fstype!=\"\", mountpoint!=\"\"})\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "" - } - ], - "title": "Disk Space Usage", - "transformations": [ - { - "id": "groupBy", - "options": { - "fields": { - "Value #A": { - "aggregations": [ - "lastNotNull" - ], - "operation": "aggregate" - }, - "Value #B": { - "aggregations": [ - "lastNotNull" - ], - "operation": "aggregate" - }, - "mountpoint": { - "aggregations": [ - - ], - "operation": "groupby" - } - } - } - }, - { - "id": "merge", - "options": { - - } - }, - { - "id": "calculateField", - "options": { - "alias": "Used", - "binary": { - "left": "Value #A (lastNotNull)", - "operator": "-", - "reducer": "sum", - "right": "Value #B (lastNotNull)" - }, - "mode": "binary", - "reduce": { - "reducer": "sum" - } - } - }, - { - "id": "calculateField", - "options": { - "alias": "Used, %", - "binary": { - "left": "Used", - "operator": "/", - "reducer": "sum", - "right": "Value #A (lastNotNull)" - }, - "mode": "binary", - "reduce": { - "reducer": "sum" - } - } - }, - { - "id": "organize", - "options": { - "excludeByName": { - - }, - "indexByName": { - - }, - "renameByName": { - "Value #A (lastNotNull)": "Size", - "Value #B (lastNotNull)": "Available", - "mountpoint": "Mounted on" - } - } - }, - { - "id": "sortBy", - "options": { - "fields": { - - }, - "sort": [ - { - "field": "Mounted on" - } - ] - } - } - ], - "transparent": false, - "type": "table" - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Disk", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "description": "Network received (bits/s)", - "fill": 0, - "fillGradient": 0, - "gridPos": { - - }, - "id": 8, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(node_network_receive_bytes_total{job=\"node-exporter\", instance=\"$instance\", device!=\"lo\"}[$__rate_interval]) * 8", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}device{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Network Received", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "description": "Network transmitted (bits/s)", - "fill": 0, - "fillGradient": 0, - "gridPos": { - - }, - "id": 9, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(node_network_transmit_bytes_total{job=\"node-exporter\", instance=\"$instance\", device!=\"lo\"}[$__rate_interval]) * 8", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}device{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Network Transmitted", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Network", - "titleSize": "h6", - "type": "row" - } - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "node-exporter-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": "Instance", - "multi": false, - "name": "instance", - "options": [ - - ], - "query": "label_values(node_uname_info{job=\"node-exporter\", sysname=\"Darwin\"}, instance)", - "refresh": 2, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Node Exporter / MacOS", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/nodes.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/nodes.yaml deleted file mode 100644 index b4ec1a6eb1..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/nodes.yaml +++ /dev/null @@ -1,1066 +0,0 @@ -{{- /* -Generated from 'nodes' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled .Values.nodeExporter.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "nodes" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - nodes.json: |- - { - "__inputs": [ - - ], - "__requires": [ - - ], - "annotations": { - "list": [ - - ] - }, - "editable": false, - "gnetId": null, - "graphTooltip": 1, - "hideControls": false, - "id": null, - "links": [ - - ], - "refresh": "30s", - "rows": [ - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 2, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(\n (1 - sum without (mode) (rate(node_cpu_seconds_total{job=\"node-exporter\", mode=~\"idle|iowait|steal\", instance=\"$instance\"}[$__rate_interval])))\n/ ignoring(cpu) group_left\n count without (cpu, mode) (node_cpu_seconds_total{job=\"node-exporter\", mode=\"idle\", instance=\"$instance\"})\n)\n", - "format": "time_series", - "intervalFactor": 5, - "legendFormat": "{{`{{`}}cpu{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU Usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": 1, - "min": 0, - "show": true - }, - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": 1, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 0, - "fillGradient": 0, - "gridPos": { - - }, - "id": 3, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "node_load1{job=\"node-exporter\", instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "1m load average", - "refId": "A" - }, - { - "expr": "node_load5{job=\"node-exporter\", instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "5m load average", - "refId": "B" - }, - { - "expr": "node_load15{job=\"node-exporter\", instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "15m load average", - "refId": "C" - }, - { - "expr": "count(node_cpu_seconds_total{job=\"node-exporter\", instance=\"$instance\", mode=\"idle\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "logical cores", - "refId": "D" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Load Average", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "CPU", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 4, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 9, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(\n node_memory_MemTotal_bytes{job=\"node-exporter\", instance=\"$instance\"}\n-\n node_memory_MemFree_bytes{job=\"node-exporter\", instance=\"$instance\"}\n-\n node_memory_Buffers_bytes{job=\"node-exporter\", instance=\"$instance\"}\n-\n node_memory_Cached_bytes{job=\"node-exporter\", instance=\"$instance\"}\n)\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "memory used", - "refId": "A" - }, - { - "expr": "node_memory_Buffers_bytes{job=\"node-exporter\", instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "memory buffers", - "refId": "B" - }, - { - "expr": "node_memory_Cached_bytes{job=\"node-exporter\", instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "memory cached", - "refId": "C" - }, - { - "expr": "node_memory_MemFree_bytes{job=\"node-exporter\", instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "memory free", - "refId": "D" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory Usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "rgba(50, 172, 45, 0.97)" - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 80 - }, - { - "color": "rgba(245, 54, 54, 0.9)", - "value": 90 - } - ] - }, - "unit": "percent" - } - }, - "gridPos": { - - }, - "id": 5, - "span": 3, - "targets": [ - { - "expr": "100 -\n(\n avg(node_memory_MemAvailable_bytes{job=\"node-exporter\", instance=\"$instance\"}) /\n avg(node_memory_MemTotal_bytes{job=\"node-exporter\", instance=\"$instance\"})\n* 100\n)\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "" - } - ], - "title": "Memory Usage", - "transparent": false, - "type": "gauge" - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Memory", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 0, - "fillGradient": 0, - "gridPos": { - - }, - "id": 6, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - { - "alias": "/ read| written/", - "yaxis": 1 - }, - { - "alias": "/ io time/", - "yaxis": 2 - } - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(node_disk_read_bytes_total{job=\"node-exporter\", instance=\"$instance\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}device{{`}}`}} read", - "refId": "A" - }, - { - "expr": "rate(node_disk_written_bytes_total{job=\"node-exporter\", instance=\"$instance\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}device{{`}}`}} written", - "refId": "B" - }, - { - "expr": "rate(node_disk_io_time_seconds_total{job=\"node-exporter\", instance=\"$instance\", device=~\"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}device{{`}}`}} io time", - "refId": "C" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Disk I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "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": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": { - - }, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "yellow", - "value": 0.8 - }, - { - "color": "red", - "value": 0.9 - } - ] - }, - "unit": "decbytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Mounted on" - }, - "properties": [ - { - "id": "custom.width", - "value": 260 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Size" - }, - "properties": [ - { - "id": "custom.width", - "value": 93 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Used" - }, - "properties": [ - { - "id": "custom.width", - "value": 72 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Available" - }, - "properties": [ - { - "id": "custom.width", - "value": 88 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Used, %" - }, - "properties": [ - { - "id": "unit", - "value": "percentunit" - }, - { - "id": "custom.displayMode", - "value": "gradient-gauge" - }, - { - "id": "max", - "value": 1 - }, - { - "id": "min", - "value": 0 - } - ] - } - ] - }, - "gridPos": { - - }, - "id": 7, - "span": 6, - "targets": [ - { - "expr": "max by (mountpoint) (node_filesystem_size_bytes{job=\"node-exporter\", instance=\"$instance\", fstype!=\"\", mountpoint!=\"\"})\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "" - }, - { - "expr": "max by (mountpoint) (node_filesystem_avail_bytes{job=\"node-exporter\", instance=\"$instance\", fstype!=\"\", mountpoint!=\"\"})\n", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "" - } - ], - "title": "Disk Space Usage", - "transformations": [ - { - "id": "groupBy", - "options": { - "fields": { - "Value #A": { - "aggregations": [ - "lastNotNull" - ], - "operation": "aggregate" - }, - "Value #B": { - "aggregations": [ - "lastNotNull" - ], - "operation": "aggregate" - }, - "mountpoint": { - "aggregations": [ - - ], - "operation": "groupby" - } - } - } - }, - { - "id": "merge", - "options": { - - } - }, - { - "id": "calculateField", - "options": { - "alias": "Used", - "binary": { - "left": "Value #A (lastNotNull)", - "operator": "-", - "reducer": "sum", - "right": "Value #B (lastNotNull)" - }, - "mode": "binary", - "reduce": { - "reducer": "sum" - } - } - }, - { - "id": "calculateField", - "options": { - "alias": "Used, %", - "binary": { - "left": "Used", - "operator": "/", - "reducer": "sum", - "right": "Value #A (lastNotNull)" - }, - "mode": "binary", - "reduce": { - "reducer": "sum" - } - } - }, - { - "id": "organize", - "options": { - "excludeByName": { - - }, - "indexByName": { - - }, - "renameByName": { - "Value #A (lastNotNull)": "Size", - "Value #B (lastNotNull)": "Available", - "mountpoint": "Mounted on" - } - } - }, - { - "id": "sortBy", - "options": { - "fields": { - - }, - "sort": [ - { - "field": "Mounted on" - } - ] - } - } - ], - "transparent": false, - "type": "table" - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Disk", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "description": "Network received (bits/s)", - "fill": 0, - "fillGradient": 0, - "gridPos": { - - }, - "id": 8, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(node_network_receive_bytes_total{job=\"node-exporter\", instance=\"$instance\", device!=\"lo\"}[$__rate_interval]) * 8", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}device{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Network Received", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "description": "Network transmitted (bits/s)", - "fill": 0, - "fillGradient": 0, - "gridPos": { - - }, - "id": 9, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(node_network_transmit_bytes_total{job=\"node-exporter\", instance=\"$instance\", device!=\"lo\"}[$__rate_interval]) * 8", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}device{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Network Transmitted", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Network", - "titleSize": "h6", - "type": "row" - } - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "node-exporter-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": "Instance", - "multi": false, - "name": "instance", - "options": [ - - ], - "query": "label_values(node_uname_info{job=\"node-exporter\", sysname!=\"Darwin\"}, instance)", - "refresh": 2, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Node Exporter / Nodes", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/persistentvolumesusage.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/persistentvolumesusage.yaml deleted file mode 100644 index 7fa1bd135b..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/persistentvolumesusage.yaml +++ /dev/null @@ -1,587 +0,0 @@ -{{- /* -Generated from 'persistentvolumesusage' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "persistentvolumesusage" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - persistentvolumesusage.json: |- - { - "__inputs": [ - - ], - "__requires": [ - - ], - "annotations": { - "list": [ - - ] - }, - "editable": false, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "id": null, - "links": [ - - ], - "refresh": "10s", - "rows": [ - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 2, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "max": true, - "min": true, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 9, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "(\n sum without(instance, node) (topk(1, (kubelet_volume_stats_capacity_bytes{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", namespace=\"$namespace\", persistentvolumeclaim=\"$volume\"})))\n -\n sum without(instance, node) (topk(1, (kubelet_volume_stats_available_bytes{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", namespace=\"$namespace\", persistentvolumeclaim=\"$volume\"})))\n)\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Used Space", - "refId": "A" - }, - { - "expr": "sum without(instance, node) (topk(1, (kubelet_volume_stats_available_bytes{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", namespace=\"$namespace\", persistentvolumeclaim=\"$volume\"})))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Free Space", - "refId": "B" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Volume Space Usage", - "tooltip": { - "shared": false, - "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": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "$datasource", - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - - }, - "id": 3, - "interval": "1m", - "legend": { - "alignAsTable": true, - "rightSide": true - }, - "links": [ - - ], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "span": 3, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "max without(instance,node) (\n(\n topk(1, kubelet_volume_stats_capacity_bytes{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", namespace=\"$namespace\", persistentvolumeclaim=\"$volume\"})\n -\n topk(1, kubelet_volume_stats_available_bytes{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", namespace=\"$namespace\", persistentvolumeclaim=\"$volume\"})\n)\n/\ntopk(1, kubelet_volume_stats_capacity_bytes{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", namespace=\"$namespace\", persistentvolumeclaim=\"$volume\"})\n* 100)\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "80, 90", - "title": "Volume Space Usage", - "tooltip": { - "shared": false - }, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 4, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "max": true, - "min": true, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 9, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum without(instance, node) (topk(1, (kubelet_volume_stats_inodes_used{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", namespace=\"$namespace\", persistentvolumeclaim=\"$volume\"})))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Used inodes", - "refId": "A" - }, - { - "expr": "(\n sum without(instance, node) (topk(1, (kubelet_volume_stats_inodes{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", namespace=\"$namespace\", persistentvolumeclaim=\"$volume\"})))\n -\n sum without(instance, node) (topk(1, (kubelet_volume_stats_inodes_used{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", namespace=\"$namespace\", persistentvolumeclaim=\"$volume\"})))\n)\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": " Free inodes", - "refId": "B" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Volume inodes Usage", - "tooltip": { - "shared": false, - "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": "none", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "$datasource", - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - - }, - "id": 5, - "interval": "1m", - "legend": { - "alignAsTable": true, - "rightSide": true - }, - "links": [ - - ], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "span": 3, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "max without(instance,node) (\ntopk(1, kubelet_volume_stats_inodes_used{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", namespace=\"$namespace\", persistentvolumeclaim=\"$volume\"})\n/\ntopk(1, kubelet_volume_stats_inodes{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", namespace=\"$namespace\", persistentvolumeclaim=\"$volume\"})\n* 100)\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "80, 90", - "title": "Volume inodes Usage", - "tooltip": { - "shared": false - }, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - } - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "kubernetes-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": "cluster", - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(kubelet_volume_stats_capacity_bytes{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\"}, cluster)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": "Namespace", - "multi": false, - "name": "namespace", - "options": [ - - ], - "query": "label_values(kubelet_volume_stats_capacity_bytes{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\"}, namespace)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": "PersistentVolumeClaim", - "multi": false, - "name": "volume", - "options": [ - - ], - "query": "label_values(kubelet_volume_stats_capacity_bytes{cluster=\"$cluster\", job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics\", namespace=\"$namespace\"}, persistentvolumeclaim)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-7d", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Kubernetes / Persistent Volumes", - "uid": "919b92a8e8041bd567af9edab12c840c", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/pod-total.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/pod-total.yaml deleted file mode 100644 index d4ce802fbd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/pod-total.yaml +++ /dev/null @@ -1,1228 +0,0 @@ -{{- /* -Generated from 'pod-total' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "pod-total" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - pod-total.json: |- - { - "__inputs": [ - - ], - "__requires": [ - - ], - "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, - "hideControls": false, - "id": null, - "links": [ - - ], - "panels": [ - { - "collapse": false, - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 2, - "panels": [ - - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Current Bandwidth", - "titleSize": "h6", - "type": "row" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "$datasource", - "decimals": 0, - "format": "time_series", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 1 - }, - "height": 9, - "id": 3, - "interval": null, - "links": [ - - ], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "minSpan": 12, - "nullPointMode": "connected", - "nullText": null, - "options": { - "fieldOptions": { - "calcs": [ - "last" - ], - "defaults": { - "max": 10000000000, - "min": 0, - "title": "$namespace: $pod", - "unit": "Bps" - }, - "mappings": [ - - ], - "override": { - - }, - "thresholds": [ - { - "color": "dark-green", - "index": 0, - "value": null - }, - { - "color": "dark-yellow", - "index": 1, - "value": 5000000000 - }, - { - "color": "dark-red", - "index": 2, - "value": 7000000000 - } - ], - "values": false - } - }, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "span": 12, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\",namespace=~\"$namespace\", pod=~\"$pod\"}[$interval:$resolution]))", - "format": "time_series", - "instant": null, - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": null, - "timeShift": null, - "title": "Current Rate of Bytes Received", - "type": "gauge", - "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", - "decimals": 0, - "format": "time_series", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 1 - }, - "height": 9, - "id": 4, - "interval": null, - "links": [ - - ], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "minSpan": 12, - "nullPointMode": "connected", - "nullText": null, - "options": { - "fieldOptions": { - "calcs": [ - "last" - ], - "defaults": { - "max": 10000000000, - "min": 0, - "title": "$namespace: $pod", - "unit": "Bps" - }, - "mappings": [ - - ], - "override": { - - }, - "thresholds": [ - { - "color": "dark-green", - "index": 0, - "value": null - }, - { - "color": "dark-yellow", - "index": 1, - "value": 5000000000 - }, - { - "color": "dark-red", - "index": 2, - "value": 7000000000 - } - ], - "values": false - } - }, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "span": 12, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\",namespace=~\"$namespace\", pod=~\"$pod\"}[$interval:$resolution]))", - "format": "time_series", - "instant": null, - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": null, - "timeShift": null, - "title": "Current Rate of Bytes Transmitted", - "type": "gauge", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "collapse": false, - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 10 - }, - "id": 5, - "panels": [ - - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Bandwidth", - "titleSize": "h6", - "type": "row" - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 11 - }, - "id": 6, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\",namespace=~\"$namespace\", pod=~\"$pod\"}[$interval:$resolution])) by (pod)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Receive Bandwidth", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 11 - }, - "id": 7, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\",namespace=~\"$namespace\", pod=~\"$pod\"}[$interval:$resolution])) by (pod)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Transmit Bandwidth", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "collapse": true, - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 20 - }, - "id": 8, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 21 - }, - "id": 9, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_packets_total{cluster=\"$cluster\",namespace=~\"$namespace\", pod=~\"$pod\"}[$interval:$resolution])) by (pod)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 21 - }, - "id": 10, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_transmit_packets_total{cluster=\"$cluster\",namespace=~\"$namespace\", pod=~\"$pod\"}[$interval:$resolution])) by (pod)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Packets", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": true, - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 21 - }, - "id": 11, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 12, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_receive_packets_dropped_total{cluster=\"$cluster\",namespace=~\"$namespace\", pod=~\"$pod\"}[$interval:$resolution])) by (pod)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets Dropped", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 32 - }, - "id": 13, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(container_network_transmit_packets_dropped_total{cluster=\"$cluster\",namespace=~\"$namespace\", pod=~\"$pod\"}[$interval:$resolution])) by (pod)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets Dropped", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Errors", - "titleSize": "h6", - "type": "row" - } - ], - "refresh": "10s", - "rows": [ - - ], - "schemaVersion": 18, - "style": "dark", - "tags": [ - "kubernetes-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": null, - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(up{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\"}, cluster)", - "refresh": 2, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".+", - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "kube-system", - "value": "kube-system" - }, - "datasource": "$datasource", - "definition": "label_values(container_network_receive_packets_total{cluster=\"$cluster\"}, namespace)", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "namespace", - "options": [ - - ], - "query": "label_values(container_network_receive_packets_total{cluster=\"$cluster\"}, namespace)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".+", - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "definition": "label_values(container_network_receive_packets_total{cluster=\"$cluster\",namespace=~\"$namespace\"}, pod)", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "pod", - "options": [ - - ], - "query": "label_values(container_network_receive_packets_total{cluster=\"$cluster\",namespace=~\"$namespace\"}, pod)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "5m", - "value": "5m" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "resolution", - "options": [ - { - "selected": false, - "text": "30s", - "value": "30s" - }, - { - "selected": true, - "text": "5m", - "value": "5m" - }, - { - "selected": false, - "text": "1h", - "value": "1h" - } - ], - "query": "30s,5m,1h", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "interval", - "useTags": false - }, - { - "allValue": null, - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "5m", - "value": "5m" - }, - "datasource": "$datasource", - "hide": 2, - "includeAll": false, - "label": null, - "multi": false, - "name": "interval", - "options": [ - { - "selected": true, - "text": "4h", - "value": "4h" - } - ], - "query": "4h", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "interval", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Kubernetes / Networking / Pod", - "uid": "7a18067ce943a40ae25454675c19ff5c", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/prometheus-remote-write.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/prometheus-remote-write.yaml deleted file mode 100644 index 082795801d..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/prometheus-remote-write.yaml +++ /dev/null @@ -1,1674 +0,0 @@ -{{- /* -Generated from 'prometheus-remote-write' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled .Values.prometheus.prometheusSpec.remoteWriteDashboards }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "prometheus-remote-write" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - prometheus-remote-write.json: |- - { - "__inputs": [ - - ], - "__requires": [ - - ], - "annotations": { - "list": [ - - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "id": null, - "links": [ - - ], - "refresh": "60s", - "rows": [ - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 2, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "(\n prometheus_remote_storage_highest_timestamp_in_seconds{cluster=~\"$cluster\", instance=~\"$instance\"} \n- \n ignoring(remote_name, url) group_right(instance) (prometheus_remote_storage_queue_highest_sent_timestamp_seconds{cluster=~\"$cluster\", instance=~\"$instance\"} != 0)\n)\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}}:{{`{{`}}instance{{`}}`}} {{`{{`}}remote_name{{`}}`}}:{{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Highest Timestamp In vs. Highest Timestamp Sent", - "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 - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 3, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "clamp_min(\n rate(prometheus_remote_storage_highest_timestamp_in_seconds{cluster=~\"$cluster\", instance=~\"$instance\"}[5m]) \n- \n ignoring (remote_name, url) group_right(instance) rate(prometheus_remote_storage_queue_highest_sent_timestamp_seconds{cluster=~\"$cluster\", instance=~\"$instance\"}[5m])\n, 0)\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}}:{{`{{`}}instance{{`}}`}} {{`{{`}}remote_name{{`}}`}}:{{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate[5m]", - "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 - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Timestamps", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 4, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(\n prometheus_remote_storage_samples_in_total{cluster=~\"$cluster\", instance=~\"$instance\"}[5m])\n- \n ignoring(remote_name, url) group_right(instance) (rate(prometheus_remote_storage_succeeded_samples_total{cluster=~\"$cluster\", instance=~\"$instance\"}[5m]) or rate(prometheus_remote_storage_samples_total{cluster=~\"$cluster\", instance=~\"$instance\"}[5m]))\n- \n (rate(prometheus_remote_storage_dropped_samples_total{cluster=~\"$cluster\", instance=~\"$instance\"}[5m]) or rate(prometheus_remote_storage_samples_dropped_total{cluster=~\"$cluster\", instance=~\"$instance\"}[5m]))\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}}:{{`{{`}}instance{{`}}`}} {{`{{`}}remote_name{{`}}`}}:{{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate, in vs. succeeded or dropped [5m]", - "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 - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Samples", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 5, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "minSpan": 6, - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_remote_storage_shards{cluster=~\"$cluster\", instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}}:{{`{{`}}instance{{`}}`}} {{`{{`}}remote_name{{`}}`}}:{{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Current Shards", - "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 - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 6, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_remote_storage_shards_max{cluster=~\"$cluster\", instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}}:{{`{{`}}instance{{`}}`}} {{`{{`}}remote_name{{`}}`}}:{{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Max Shards", - "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 - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 7, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_remote_storage_shards_min{cluster=~\"$cluster\", instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}}:{{`{{`}}instance{{`}}`}} {{`{{`}}remote_name{{`}}`}}:{{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Min Shards", - "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 - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 8, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_remote_storage_shards_desired{cluster=~\"$cluster\", instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}}:{{`{{`}}instance{{`}}`}} {{`{{`}}remote_name{{`}}`}}:{{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Desired Shards", - "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 - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Shards", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 9, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_remote_storage_shard_capacity{cluster=~\"$cluster\", instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}}:{{`{{`}}instance{{`}}`}} {{`{{`}}remote_name{{`}}`}}:{{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Shard Capacity", - "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 - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 10, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_remote_storage_pending_samples{cluster=~\"$cluster\", instance=~\"$instance\"} or prometheus_remote_storage_samples_pending{cluster=~\"$cluster\", instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}}:{{`{{`}}instance{{`}}`}} {{`{{`}}remote_name{{`}}`}}:{{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Pending Samples", - "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 - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Shard Details", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 11, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_wal_segment_current{cluster=~\"$cluster\", instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}}:{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "TSDB Current Segment", - "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 - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 12, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_wal_watcher_current_segment{cluster=~\"$cluster\", instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}}:{{`{{`}}instance{{`}}`}} {{`{{`}}consumer{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Remote Write Current Segment", - "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 - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Segments", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 13, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 3, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_remote_storage_dropped_samples_total{cluster=~\"$cluster\", instance=~\"$instance\"}[5m]) or rate(prometheus_remote_storage_samples_dropped_total{cluster=~\"$cluster\", instance=~\"$instance\"}[5m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}}:{{`{{`}}instance{{`}}`}} {{`{{`}}remote_name{{`}}`}}:{{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Dropped Samples", - "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 - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 14, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 3, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_remote_storage_failed_samples_total{cluster=~\"$cluster\", instance=~\"$instance\"}[5m]) or rate(prometheus_remote_storage_samples_failed_total{cluster=~\"$cluster\", instance=~\"$instance\"}[5m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}}:{{`{{`}}instance{{`}}`}} {{`{{`}}remote_name{{`}}`}}:{{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Failed Samples", - "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 - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 15, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 3, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_remote_storage_retried_samples_total{cluster=~\"$cluster\", instance=~\"$instance\"}[5m]) or rate(prometheus_remote_storage_samples_retried_total{cluster=~\"$cluster\", instance=~\"$instance\"}[5m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}}:{{`{{`}}instance{{`}}`}} {{`{{`}}remote_name{{`}}`}}:{{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Retried Samples", - "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 - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 16, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 3, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_remote_storage_enqueue_retries_total{cluster=~\"$cluster\", instance=~\"$instance\"}[5m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}}:{{`{{`}}instance{{`}}`}} {{`{{`}}remote_name{{`}}`}}:{{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Enqueue Retries", - "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 - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Misc. Rates", - "titleSize": "h6", - "type": "row" - } - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "prometheus-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - "text": { - "selected": true, - "text": "All", - "value": "$__all" - }, - "value": { - "selected": true, - "text": "All", - "value": "$__all" - } - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": true, - "label": null, - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(kube_pod_container_info{image=~\".*prometheus.*\"}, cluster)", - "refresh": 2, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "text": { - "selected": true, - "text": "All", - "value": "$__all" - }, - "value": { - "selected": true, - "text": "All", - "value": "$__all" - } - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "instance", - "options": [ - - ], - "query": "label_values(prometheus_build_info{cluster=~\"$cluster\"}, instance)", - "refresh": 2, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "url", - "options": [ - - ], - "query": "label_values(prometheus_remote_storage_shards{cluster=~\"$cluster\", instance=~\"$instance\"}, url)", - "refresh": 2, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Prometheus / Remote Write", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/prometheus.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/prometheus.yaml deleted file mode 100644 index f527ac11b3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/prometheus.yaml +++ /dev/null @@ -1,1235 +0,0 @@ -{{- /* -Generated from 'prometheus' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "prometheus" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - prometheus.json: |- - { - "annotations": { - "list": [ - - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "links": [ - - ], - "refresh": "60s", - "rows": [ - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 1, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "Count", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [ - - ], - "type": "hidden", - "unit": "short" - }, - { - "alias": "Uptime", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [ - - ], - "type": "number", - "unit": "s" - }, - { - "alias": "Instance", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "instance", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "Job", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "job", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "Version", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "version", - "thresholds": [ - - ], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [ - - ], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "expr": "count by (job, instance, version) (prometheus_build_info{job=~\"$job\", instance=~\"$instance\"})", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 10 - }, - { - "expr": "max by (job, instance) (time() - process_start_time_seconds{job=~\"$job\", instance=~\"$instance\"})", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "", - "refId": "B", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Prometheus Stats", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table", - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Prometheus Stats", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(prometheus_target_sync_length_seconds_sum{job=~\"$job\",instance=~\"$instance\"}[5m])) by (scrape_job) * 1e3", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}scrape_job{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Target Sync", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "ms", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 3, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(prometheus_sd_discovered_targets{job=~\"$job\",instance=~\"$instance\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Targets", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Targets", - "tooltip": { - "shared": true, - "sort": 2, - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Discovery", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_target_interval_length_seconds_sum{job=~\"$job\",instance=~\"$instance\"}[5m]) / rate(prometheus_target_interval_length_seconds_count{job=~\"$job\",instance=~\"$instance\"}[5m]) * 1e3", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}interval{{`}}`}} configured", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Average Scrape Interval Duration", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "ms", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 5, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum by (job) (rate(prometheus_target_scrapes_exceeded_body_size_limit_total[1m]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "exceeded body size limit: {{`{{`}}job{{`}}`}}", - "legendLink": null, - "step": 10 - }, - { - "expr": "sum by (job) (rate(prometheus_target_scrapes_exceeded_sample_limit_total[1m]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "exceeded sample limit: {{`{{`}}job{{`}}`}}", - "legendLink": null, - "step": 10 - }, - { - "expr": "sum by (job) (rate(prometheus_target_scrapes_sample_duplicate_timestamp_total[1m]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "duplicate timestamp: {{`{{`}}job{{`}}`}}", - "legendLink": null, - "step": 10 - }, - { - "expr": "sum by (job) (rate(prometheus_target_scrapes_sample_out_of_bounds_total[1m]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "out of bounds: {{`{{`}}job{{`}}`}}", - "legendLink": null, - "step": 10 - }, - { - "expr": "sum by (job) (rate(prometheus_target_scrapes_sample_out_of_order_total[1m]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "out of order: {{`{{`}}job{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Scrape failures", - "tooltip": { - "shared": true, - "sort": 2, - "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": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 6, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_head_samples_appended_total{job=~\"$job\",instance=~\"$instance\"}[5m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}job{{`}}`}} {{`{{`}}instance{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Appended Samples", - "tooltip": { - "shared": true, - "sort": 2, - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Retrieval", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 7, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_head_series{job=~\"$job\",instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}job{{`}}`}} {{`{{`}}instance{{`}}`}} head series", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Head Series", - "tooltip": { - "shared": true, - "sort": 2, - "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": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_head_chunks{job=~\"$job\",instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}job{{`}}`}} {{`{{`}}instance{{`}}`}} head chunks", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Head Chunks", - "tooltip": { - "shared": true, - "sort": 2, - "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": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Storage", - "titleSize": "h6" - }, - { - "collapse": false, - "height": "250px", - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 9, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_engine_query_duration_seconds_count{job=~\"$job\",instance=~\"$instance\",slice=\"inner_eval\"}[5m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}job{{`}}`}} {{`{{`}}instance{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Query Rate", - "tooltip": { - "shared": true, - "sort": 2, - "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": false - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 10, - "id": 10, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "links": [ - - ], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "max by (slice) (prometheus_engine_query_duration_seconds{quantile=\"0.9\",job=~\"$job\",instance=~\"$instance\"}) * 1e3", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}slice{{`}}`}}", - "legendLink": null, - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Stage Duration", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "ms", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Query", - "titleSize": "h6" - } - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "prometheus-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": ".+", - "current": { - "selected": true, - "text": "All", - "value": "$__all" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": true, - "label": "job", - "multi": true, - "name": "job", - "options": [ - - ], - "query": "label_values(prometheus_build_info{job=\"prometheus-k8s\",namespace=\"monitoring\"}, job)", - "refresh": 1, - "regex": "", - "sort": 2, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".+", - "current": { - "selected": true, - "text": "All", - "value": "$__all" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": true, - "label": "instance", - "multi": true, - "name": "instance", - "options": [ - - ], - "query": "label_values(prometheus_build_info{job=~\"$job\"}, instance)", - "refresh": 1, - "regex": "", - "sort": 2, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Prometheus / Overview", - "uid": "", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/proxy.yaml deleted file mode 100644 index 77d4fdf9eb..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/proxy.yaml +++ /dev/null @@ -1,1276 +0,0 @@ -{{- /* -Generated from 'proxy' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -{{- if (include "exporter.kubeProxy.enabled" .)}} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "proxy" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - proxy.json: |- - { - "__inputs": [ - - ], - "__requires": [ - - ], - "annotations": { - "list": [ - - ] - }, - "editable": false, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "id": null, - "links": [ - - ], - "refresh": "10s", - "rows": [ - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "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": { - - }, - "id": 2, - "interval": "1m", - "legend": { - "alignAsTable": true, - "rightSide": true - }, - "links": [ - - ], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "span": 2, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - {{- if .Values.k3sServer.enabled }} - "expr": "sum(up{cluster=\"$cluster\", job=\"{{ include "exporter.kubeProxy.jobName" . }}\", metrics_path=\"/metrics\"})", - {{- else }} - "expr": "sum(up{cluster=\"$cluster\", job=\"{{ include "exporter.kubeProxy.jobName" . }}\"})", - {{- end }} - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "", - "title": "Up", - "tooltip": { - "shared": false - }, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "min" - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 3, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 5, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(kubeproxy_sync_proxy_rules_duration_seconds_count{cluster=\"$cluster\", job=\"{{ include "exporter.kubeProxy.jobName" . }}\", instance=~\"$instance\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "rate", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rules Sync Rate", - "tooltip": { - "shared": false, - "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": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 4, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 5, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99,rate(kubeproxy_sync_proxy_rules_duration_seconds_bucket{cluster=\"$cluster\", job=\"{{ include "exporter.kubeProxy.jobName" . }}\", instance=~\"$instance\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rule Sync Latency 99th Quantile", - "tooltip": { - "shared": false, - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 5, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(kubeproxy_network_programming_duration_seconds_count{cluster=\"$cluster\", job=\"{{ include "exporter.kubeProxy.jobName" . }}\", instance=~\"$instance\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "rate", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Network Programming Rate", - "tooltip": { - "shared": false, - "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": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 6, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 6, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(kubeproxy_network_programming_duration_seconds_bucket{cluster=\"$cluster\", job=\"{{ include "exporter.kubeProxy.jobName" . }}\", instance=~\"$instance\"}[$__rate_interval])) by (instance, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Network Programming Latency 99th Quantile", - "tooltip": { - "shared": false, - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 7, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(rest_client_requests_total{cluster=\"$cluster\", job=\"{{ include "exporter.kubeProxy.jobName" . }}\", instance=~\"$instance\",code=~\"2..\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "2xx", - "refId": "A" - }, - { - "expr": "sum(rate(rest_client_requests_total{cluster=\"$cluster\", job=\"{{ include "exporter.kubeProxy.jobName" . }}\", instance=~\"$instance\",code=~\"3..\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "3xx", - "refId": "B" - }, - { - "expr": "sum(rate(rest_client_requests_total{cluster=\"$cluster\", job=\"{{ include "exporter.kubeProxy.jobName" . }}\", instance=~\"$instance\",code=~\"4..\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "4xx", - "refId": "C" - }, - { - "expr": "sum(rate(rest_client_requests_total{cluster=\"$cluster\", job=\"{{ include "exporter.kubeProxy.jobName" . }}\", instance=~\"$instance\",code=~\"5..\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "5xx", - "refId": "D" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Kube API Request Rate", - "tooltip": { - "shared": false, - "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": null, - "show": true - }, - { - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 8, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 8, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(rest_client_request_duration_seconds_bucket{cluster=\"$cluster\", job=\"{{ include "exporter.kubeProxy.jobName" . }}\",instance=~\"$instance\",verb=\"POST\"}[$__rate_interval])) by (verb, url, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}verb{{`}}`}} {{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Post Request Latency 99th Quantile", - "tooltip": { - "shared": false, - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 9, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(rest_client_request_duration_seconds_bucket{cluster=\"$cluster\", job=\"{{ include "exporter.kubeProxy.jobName" . }}\", instance=~\"$instance\", verb=\"GET\"}[$__rate_interval])) by (verb, url, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}verb{{`}}`}} {{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Get Request Latency 99th Quantile", - "tooltip": { - "shared": false, - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 10, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "process_resident_memory_bytes{cluster=\"$cluster\", job=\"{{ include "exporter.kubeProxy.jobName" . }}\",instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory", - "tooltip": { - "shared": false, - "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": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 11, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(process_cpu_seconds_total{cluster=\"$cluster\", job=\"{{ include "exporter.kubeProxy.jobName" . }}\",instance=~\"$instance\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU usage", - "tooltip": { - "shared": false, - "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 - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 12, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "go_goroutines{cluster=\"$cluster\", job=\"{{ include "exporter.kubeProxy.jobName" . }}\",instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Goroutines", - "tooltip": { - "shared": false, - "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 - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - } - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "kubernetes-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": "cluster", - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(up{job=\"{{ include "exporter.kubeProxy.jobName" . }}\"}, cluster)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "instance", - "options": [ - - ], - "query": "label_values(up{job=\"{{ include "exporter.kubeProxy.jobName" . }}\", cluster=\"$cluster\", job=\"{{ include "exporter.kubeProxy.jobName" . }}\"}, instance)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Kubernetes / Proxy", - "uid": "632e265de029684c40b21cb76bca4f94", - "version": 0 - } -{{- end }}{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/scheduler.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/scheduler.yaml deleted file mode 100644 index b71a9d4e4b..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/scheduler.yaml +++ /dev/null @@ -1,1118 +0,0 @@ -{{- /* -Generated from 'scheduler' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -{{- if (include "exporter.kubeScheduler.enabled" .)}} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "scheduler" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - scheduler.json: |- - { - "__inputs": [ - - ], - "__requires": [ - - ], - "annotations": { - "list": [ - - ] - }, - "editable": false, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "id": null, - "links": [ - - ], - "refresh": "10s", - "rows": [ - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "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": { - - }, - "id": 2, - "interval": "1m", - "legend": { - "alignAsTable": true, - "rightSide": true - }, - "links": [ - - ], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "span": 2, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - {{- if .Values.k3sServer.enabled }} - "expr": "sum(up{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\", metrics_path=\"/metrics\"})", - {{- else }} - "expr": "sum(up{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\"})", - {{- end }} - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "", - "title": "Up", - "tooltip": { - "shared": false - }, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "min" - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 3, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 5, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(scheduler_e2e_scheduling_duration_seconds_count{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\", instance=~\"$instance\"}[$__rate_interval])) by (cluster, instance)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}} {{`{{`}}instance{{`}}`}} e2e", - "refId": "A" - }, - { - "expr": "sum(rate(scheduler_binding_duration_seconds_count{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\", instance=~\"$instance\"}[$__rate_interval])) by (cluster, instance)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}} {{`{{`}}instance{{`}}`}} binding", - "refId": "B" - }, - { - "expr": "sum(rate(scheduler_scheduling_algorithm_duration_seconds_count{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\", instance=~\"$instance\"}[$__rate_interval])) by (cluster, instance)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}} {{`{{`}}instance{{`}}`}} scheduling algorithm", - "refId": "C" - }, - { - "expr": "sum(rate(scheduler_volume_scheduling_duration_seconds_count{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\", instance=~\"$instance\"}[$__rate_interval])) by (cluster, instance)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}} {{`{{`}}instance{{`}}`}} volume", - "refId": "D" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Scheduling Rate", - "tooltip": { - "shared": false, - "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": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 4, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 5, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(scheduler_e2e_scheduling_duration_seconds_bucket{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\",instance=~\"$instance\"}[$__rate_interval])) by (cluster, instance, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}} {{`{{`}}instance{{`}}`}} e2e", - "refId": "A" - }, - { - "expr": "histogram_quantile(0.99, sum(rate(scheduler_binding_duration_seconds_bucket{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\",instance=~\"$instance\"}[$__rate_interval])) by (cluster, instance, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}} {{`{{`}}instance{{`}}`}} binding", - "refId": "B" - }, - { - "expr": "histogram_quantile(0.99, sum(rate(scheduler_scheduling_algorithm_duration_seconds_bucket{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\",instance=~\"$instance\"}[$__rate_interval])) by (cluster, instance, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}} {{`{{`}}instance{{`}}`}} scheduling algorithm", - "refId": "C" - }, - { - "expr": "histogram_quantile(0.99, sum(rate(scheduler_volume_scheduling_duration_seconds_bucket{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\",instance=~\"$instance\"}[$__rate_interval])) by (cluster, instance, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}cluster{{`}}`}} {{`{{`}}instance{{`}}`}} volume", - "refId": "D" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Scheduling latency 99th Quantile", - "tooltip": { - "shared": false, - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 5, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(rest_client_requests_total{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\", instance=~\"$instance\",code=~\"2..\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "2xx", - "refId": "A" - }, - { - "expr": "sum(rate(rest_client_requests_total{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\", instance=~\"$instance\",code=~\"3..\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "3xx", - "refId": "B" - }, - { - "expr": "sum(rate(rest_client_requests_total{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\", instance=~\"$instance\",code=~\"4..\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "4xx", - "refId": "C" - }, - { - "expr": "sum(rate(rest_client_requests_total{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\", instance=~\"$instance\",code=~\"5..\"}[$__rate_interval]))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "5xx", - "refId": "D" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Kube API Request Rate", - "tooltip": { - "shared": false, - "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": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 6, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 8, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(rest_client_request_duration_seconds_bucket{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\", instance=~\"$instance\", verb=\"POST\"}[$__rate_interval])) by (verb, url, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}verb{{`}}`}} {{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Post Request Latency 99th Quantile", - "tooltip": { - "shared": false, - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 7, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, sum(rate(rest_client_request_duration_seconds_bucket{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\", instance=~\"$instance\", verb=\"GET\"}[$__rate_interval])) by (verb, url, le))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}verb{{`}}`}} {{`{{`}}url{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Get Request Latency 99th Quantile", - "tooltip": { - "shared": false, - "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": "s", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 8, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "process_resident_memory_bytes{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\", instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Memory", - "tooltip": { - "shared": false, - "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": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 9, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(process_cpu_seconds_total{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\", instance=~\"$instance\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "CPU usage", - "tooltip": { - "shared": false, - "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": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - - }, - "id": 10, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [ - - ], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "go_goroutines{cluster=\"$cluster\", job=\"{{ include "exporter.kubeScheduler.jobName" . }}\",instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{`{{`}}instance{{`}}`}}", - "refId": "A" - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Goroutines", - "tooltip": { - "shared": false, - "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 - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": false, - "title": "Dashboard Row", - "titleSize": "h6", - "type": "row" - } - ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "kubernetes-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": "cluster", - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(up{job=\"{{ include "exporter.kubeScheduler.jobName" . }}\"}, cluster)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "instance", - "options": [ - - ], - "query": "label_values(up{job=\"{{ include "exporter.kubeScheduler.jobName" . }}\", cluster=\"$cluster\"}, instance)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Kubernetes / Scheduler", - "uid": "2e6b6a3b4bddf1427b3a55aa1311c656", - "version": 0 - } -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/workload-total.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/workload-total.yaml deleted file mode 100644 index 043af9af96..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/dashboards-1.14/workload-total.yaml +++ /dev/null @@ -1,1438 +0,0 @@ -{{- /* -Generated from 'workload-total' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (or .Values.grafana.enabled .Values.grafana.forceDeployDashboards) (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "workload-total" | trunc 63 | trimSuffix "-" }} - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: {{ ternary $.Values.grafana.sidecar.dashboards.labelValue "1" (not (empty $.Values.grafana.sidecar.dashboards.labelValue)) | quote }} - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: - workload-total.json: |- - { - "__inputs": [ - - ], - "__requires": [ - - ], - "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, - "hideControls": false, - "id": null, - "links": [ - - ], - "panels": [ - { - "collapse": false, - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 2, - "panels": [ - - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Current Bandwidth", - "titleSize": "h6", - "type": "row" - }, - { - "aliasColors": { - - }, - "bars": true, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 1 - }, - "id": 3, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": false, - "linewidth": 1, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "null", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_receive_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=~\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}} pod {{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Current Rate of Bytes Received", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "series", - "name": null, - "show": false, - "values": [ - "current" - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": true, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 1 - }, - "id": 4, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": false, - "linewidth": 1, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "null", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_transmit_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=~\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}} pod {{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Current Rate of Bytes Transmitted", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "series", - "name": null, - "show": false, - "values": [ - "current" - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "collapse": true, - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 10 - }, - "id": 5, - "panels": [ - { - "aliasColors": { - - }, - "bars": true, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 11 - }, - "id": 6, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": false, - "linewidth": 1, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "null", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(avg(irate(container_network_receive_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=~\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}} pod {{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Average Rate of Bytes Received", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "series", - "name": null, - "show": false, - "values": [ - "current" - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": true, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 11 - }, - "id": 7, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": false, - "linewidth": 1, - "links": [ - - ], - "minSpan": 24, - "nullPointMode": "null", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 24, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(avg(irate(container_network_transmit_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=~\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}} pod {{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Average Rate of Bytes Transmitted", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "series", - "name": null, - "show": false, - "values": [ - "current" - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Average Bandwidth", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": false, - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 11 - }, - "id": 8, - "panels": [ - - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Bandwidth HIstory", - "titleSize": "h6", - "type": "row" - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 12 - }, - "id": 9, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_receive_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=~\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Receive Bandwidth", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 12 - }, - "id": 10, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_transmit_bytes_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=~\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Transmit Bandwidth", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "collapse": true, - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 21 - }, - "id": 11, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 22 - }, - "id": 12, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_receive_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=~\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 22 - }, - "id": 13, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_transmit_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=~\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Packets", - "titleSize": "h6", - "type": "row" - }, - { - "collapse": true, - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 22 - }, - "id": 14, - "panels": [ - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 23 - }, - "id": 15, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_receive_packets_dropped_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=~\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Received Packets Dropped", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - }, - { - "aliasColors": { - - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 2, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 23 - }, - "id": 16, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [ - - ], - "minSpan": 12, - "nullPointMode": "connected", - "paceLength": 10, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - - ], - "spaceLength": 10, - "span": 12, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sort_desc(sum(irate(container_network_transmit_packets_dropped_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\",namespace=~\"$namespace\"}[$interval:$resolution])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=~\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{`{{`}}pod{{`}}`}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - - ], - "timeFrom": null, - "timeShift": null, - "title": "Rate of Transmitted Packets Dropped", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - - ] - }, - "yaxes": [ - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - }, - { - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true - } - ] - } - ], - "repeat": null, - "repeatIteration": null, - "repeatRowId": null, - "showTitle": true, - "title": "Errors", - "titleSize": "h6", - "type": "row" - } - ], - "refresh": "10s", - "rows": [ - - ], - "schemaVersion": 18, - "style": "dark", - "tags": [ - "kubernetes-mixin" - ], - "templating": { - "list": [ - { - "current": { - "text": "Prometheus", - "value": "Prometheus" - }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ - - ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": null, - "current": { - - }, - "datasource": "$datasource", - "hide": {{ if .Values.grafana.sidecar.dashboards.multicluster.global.enabled }}0{{ else }}2{{ end }}, - "includeAll": false, - "label": null, - "multi": false, - "name": "cluster", - "options": [ - - ], - "query": "label_values(kube_pod_info{job=\"kube-state-metrics\"}, cluster)", - "refresh": 2, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".+", - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "kube-system", - "value": "kube-system" - }, - "datasource": "$datasource", - "definition": "label_values(container_network_receive_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\"}, namespace)", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "namespace", - "options": [ - - ], - "query": "label_values(container_network_receive_packets_total{job=\"{{ include "exporter.kubelet.jobName" . }}\", metrics_path=\"/metrics/cadvisor\", cluster=\"$cluster\"}, namespace)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "", - "value": "" - }, - "datasource": "$datasource", - "definition": "label_values(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=~\"$namespace\"}, workload)", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "workload", - "options": [ - - ], - "query": "label_values(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=~\"$namespace\"}, workload)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "deployment", - "value": "deployment" - }, - "datasource": "$datasource", - "definition": "label_values(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=~\"$namespace\", workload=~\"$workload\"}, workload_type)", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "type", - "options": [ - - ], - "query": "label_values(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\",namespace=~\"$namespace\", workload=~\"$workload\"}, workload_type)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "5m", - "value": "5m" - }, - "datasource": "$datasource", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "resolution", - "options": [ - { - "selected": false, - "text": "30s", - "value": "30s" - }, - { - "selected": true, - "text": "5m", - "value": "5m" - }, - { - "selected": false, - "text": "1h", - "value": "1h" - } - ], - "query": "30s,5m,1h", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "interval", - "useTags": false - }, - { - "allValue": null, - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "5m", - "value": "5m" - }, - "datasource": "$datasource", - "hide": 2, - "includeAll": false, - "label": null, - "multi": false, - "name": "interval", - "options": [ - { - "selected": true, - "text": "4h", - "value": "4h" - } - ], - "query": "4h", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [ - - ], - "tagsQuery": "", - "type": "interval", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "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": "{{ .Values.grafana.defaultDashboardsTimezone }}", - "title": "Kubernetes / Networking / Workload", - "uid": "728bf77cc1166d2f3133bf25846876cc", - "version": 0 - } -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/namespaces.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/namespaces.yaml deleted file mode 100644 index 39ed210ed4..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/grafana/namespaces.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if and .Values.grafana.enabled .Values.grafana.defaultDashboardsEnabled (not .Values.grafana.defaultDashboards.useExistingNamespace) }} -apiVersion: v1 -kind: Namespace -metadata: - name: {{ .Values.grafana.defaultDashboards.namespace }} - labels: - name: {{ .Values.grafana.defaultDashboards.namespace }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} - annotations: -{{- if not .Values.grafana.defaultDashboards.cleanupOnUninstall }} - helm.sh/resource-policy: "keep" -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/ciliumnetworkpolicy-createSecret.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/ciliumnetworkpolicy-createSecret.yaml deleted file mode 100644 index f3a2f710a3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/ciliumnetworkpolicy-createSecret.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if and .Values.prometheusOperator.networkPolicy.enabled (eq .Values.prometheusOperator.networkPolicy.flavor "cilium") }} -{{- if and .Values.prometheusOperator.enabled .Values.prometheusOperator.admissionWebhooks.enabled .Values.prometheusOperator.admissionWebhooks.patch.enabled (not .Values.prometheusOperator.admissionWebhooks.certManager.enabled) }} -apiVersion: cilium.io/v2 -kind: CiliumNetworkPolicy -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-admission-create - namespace: {{ template "kube-prometheus-stack.namespace" . }} - annotations: - helm.sh/hook: post-install,post-upgrade - helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded - ## Ensure this is run before the job - helm.sh/hook-weight: "-5" - {{- with .Values.prometheusOperator.admissionWebhooks.annotations }} - {{ toYaml . | nindent 4 }} - {{- end }} - labels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission-create - {{- include "kube-prometheus-stack.labels" $ | nindent 4 }} -spec: - endpointSelector: - matchLabels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission-create - {{- include "kube-prometheus-stack.labels" $ | nindent 6 }} - egress: - {{- if and .Values.prometheusOperator.networkPolicy.cilium .Values.prometheusOperator.networkPolicy.cilium.egress }} - {{ toYaml .Values.prometheusOperator.networkPolicy.cilium.egress | nindent 6 }} - {{- else }} - - toEntities: - - kube-apiserver - {{- end }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/ciliumnetworkpolicy-patchWebhook.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/ciliumnetworkpolicy-patchWebhook.yaml deleted file mode 100644 index f16857f25e..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/ciliumnetworkpolicy-patchWebhook.yaml +++ /dev/null @@ -1,33 +0,0 @@ -{{- if and .Values.prometheusOperator.networkPolicy.enabled (eq .Values.prometheusOperator.networkPolicy.flavor "cilium") }} -{{- if and .Values.prometheusOperator.enabled .Values.prometheusOperator.admissionWebhooks.enabled .Values.prometheusOperator.admissionWebhooks.patch.enabled (not .Values.prometheusOperator.admissionWebhooks.certManager.enabled) }} -apiVersion: cilium.io/v2 -kind: CiliumNetworkPolicy -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-admission-patch - namespace: {{ template "kube-prometheus-stack.namespace" . }} - annotations: - helm.sh/hook: post-install,post-upgrade - helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded - ## Ensure this is run before the job - helm.sh/hook-weight: "-5" - {{- with .Values.prometheusOperator.admissionWebhooks.patch.annotations }} - {{ toYaml . | nindent 4 }} - {{- end }} - labels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission-patch - {{- include "kube-prometheus-stack.labels" $ | nindent 4 }} -spec: - endpointSelector: - matchLabels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission-patch - {{- include "kube-prometheus-stack.labels" $ | nindent 6 }} - egress: - {{- if and .Values.prometheusOperator.networkPolicy.cilium .Values.prometheusOperator.networkPolicy.cilium.egress }} - {{ toYaml .Values.prometheusOperator.networkPolicy.cilium.egress | nindent 6 }} - {{- else }} - - toEntities: - - kube-apiserver - {{- end }} -{{- end }} -{{- end }} - diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/clusterrole.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/clusterrole.yaml deleted file mode 100644 index 7eb6527f9a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/clusterrole.yaml +++ /dev/null @@ -1,33 +0,0 @@ -{{- if and .Values.prometheusOperator.enabled .Values.prometheusOperator.admissionWebhooks.enabled .Values.prometheusOperator.admissionWebhooks.patch.enabled .Values.global.rbac.create (not .Values.prometheusOperator.admissionWebhooks.certManager.enabled) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-admission - annotations: - "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded - labels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission -{{- include "kube-prometheus-stack.labels" $ | indent 4 }} -rules: - - apiGroups: - - admissionregistration.k8s.io - resources: - - validatingwebhookconfigurations - - mutatingwebhookconfigurations - verbs: - - get - - update -{{- if and (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") (or .Values.global.cattle.psp.enabled .Values.global.rbac.pspEnabled) }} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if semverCompare "> 1.15.0-0" $kubeTargetVersion }} - - apiGroups: ['policy'] -{{- else }} - - apiGroups: ['extensions'] -{{- end }} - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "kube-prometheus-stack.fullname" . }}-admission -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/clusterrolebinding.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/clusterrolebinding.yaml deleted file mode 100644 index b909d14ebd..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/clusterrolebinding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if and .Values.prometheusOperator.enabled .Values.prometheusOperator.admissionWebhooks.enabled .Values.prometheusOperator.admissionWebhooks.patch.enabled .Values.global.rbac.create (not .Values.prometheusOperator.admissionWebhooks.certManager.enabled) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-admission - annotations: - "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded - labels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission -{{- include "kube-prometheus-stack.labels" $ | indent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "kube-prometheus-stack.fullname" . }}-admission -subjects: - - kind: ServiceAccount - name: {{ template "kube-prometheus-stack.fullname" . }}-admission - namespace: {{ template "kube-prometheus-stack.namespace" . }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/job-createSecret.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/job-createSecret.yaml deleted file mode 100644 index 83ba6268be..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/job-createSecret.yaml +++ /dev/null @@ -1,73 +0,0 @@ -{{- if and .Values.prometheusOperator.enabled .Values.prometheusOperator.admissionWebhooks.enabled .Values.prometheusOperator.admissionWebhooks.patch.enabled (not .Values.prometheusOperator.admissionWebhooks.certManager.enabled) }} -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-admission-create - namespace: {{ template "kube-prometheus-stack.namespace" . }} - annotations: - "helm.sh/hook": pre-install,pre-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded -{{- with .Values.prometheusOperator.admissionWebhooks.annotations }} -{{ toYaml . | indent 4 }} -{{- end }} - labels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission-create -{{- include "kube-prometheus-stack.labels" $ | indent 4 }} -spec: - {{- if .Capabilities.APIVersions.Has "batch/v1alpha1" }} - # Alpha feature since k8s 1.12 - ttlSecondsAfterFinished: 0 - {{- end }} - template: - metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-admission-create -{{- with .Values.prometheusOperator.admissionWebhooks.patch.podAnnotations }} - annotations: -{{ toYaml . | indent 8 }} -{{- end }} - labels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission-create -{{- include "kube-prometheus-stack.labels" $ | indent 8 }} - spec: - {{- if .Values.prometheusOperator.admissionWebhooks.patch.priorityClassName }} - priorityClassName: {{ .Values.prometheusOperator.admissionWebhooks.patch.priorityClassName }} - {{- end }} - containers: - - name: create - {{- $registry := include "monitoring_registry" . | default .Values.prometheusOperator.admissionWebhooks.patch.image.registry -}} - {{- if .Values.prometheusOperator.admissionWebhooks.patch.image.sha }} - image: {{ $registry }}/{{ .Values.prometheusOperator.admissionWebhooks.patch.image.repository }}:{{ .Values.prometheusOperator.admissionWebhooks.patch.image.tag }}@sha256:{{ .Values.prometheusOperator.admissionWebhooks.patch.image.sha }} - {{- else }} - image: {{ $registry }}/{{ .Values.prometheusOperator.admissionWebhooks.patch.image.repository }}:{{ .Values.prometheusOperator.admissionWebhooks.patch.image.tag }} - {{- end }} - imagePullPolicy: {{ .Values.prometheusOperator.admissionWebhooks.patch.image.pullPolicy }} - args: - - create - - --host={{ template "kube-prometheus-stack.operator.fullname" . }},{{ template "kube-prometheus-stack.operator.fullname" . }}.{{ template "kube-prometheus-stack.namespace" . }}.svc - - --namespace={{ template "kube-prometheus-stack.namespace" . }} - - --secret-name={{ template "kube-prometheus-stack.fullname" . }}-admission - {{- with .Values.prometheusOperator.admissionWebhooks.createSecretJob }} - securityContext: - {{ toYaml .securityContext | nindent 12 }} - {{- end }} - resources: -{{ toYaml .Values.prometheusOperator.admissionWebhooks.patch.resources | indent 12 }} - restartPolicy: OnFailure - serviceAccountName: {{ template "kube-prometheus-stack.fullname" . }}-admission - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- with .Values.prometheusOperator.admissionWebhooks.patch.nodeSelector }} -{{ toYaml . | indent 8 }} -{{- end }} - {{- with .Values.prometheusOperator.admissionWebhooks.patch.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- with .Values.prometheusOperator.admissionWebhooks.patch.tolerations }} -{{ toYaml . | indent 8 }} - {{- end }} -{{- if .Values.prometheusOperator.admissionWebhooks.patch.securityContext }} - securityContext: -{{ toYaml .Values.prometheusOperator.admissionWebhooks.patch.securityContext | indent 8 }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/job-patchWebhook.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/job-patchWebhook.yaml deleted file mode 100644 index 8234019b83..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/job-patchWebhook.yaml +++ /dev/null @@ -1,74 +0,0 @@ -{{- if and .Values.prometheusOperator.enabled .Values.prometheusOperator.admissionWebhooks.enabled .Values.prometheusOperator.admissionWebhooks.patch.enabled (not .Values.prometheusOperator.admissionWebhooks.certManager.enabled) }} -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-admission-patch - namespace: {{ template "kube-prometheus-stack.namespace" . }} - annotations: - "helm.sh/hook": post-install,post-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded -{{- with .Values.prometheusOperator.admissionWebhooks.patch.annotations }} -{{ toYaml . | indent 4 }} -{{- end }} - labels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission-patch -{{- include "kube-prometheus-stack.labels" $ | indent 4 }} -spec: - {{- if .Capabilities.APIVersions.Has "batch/v1alpha1" }} - # Alpha feature since k8s 1.12 - ttlSecondsAfterFinished: 0 - {{- end }} - template: - metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-admission-patch -{{- with .Values.prometheusOperator.admissionWebhooks.patch.podAnnotations }} - annotations: -{{ toYaml . | indent 8 }} -{{- end }} - labels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission-patch -{{- include "kube-prometheus-stack.labels" $ | indent 8 }} - spec: - {{- if .Values.prometheusOperator.admissionWebhooks.patch.priorityClassName }} - priorityClassName: {{ .Values.prometheusOperator.admissionWebhooks.patch.priorityClassName }} - {{- end }} - containers: - - name: patch - {{- $registry := include "monitoring_registry" . | default .Values.prometheusOperator.admissionWebhooks.patch.image.registry -}} - {{- if .Values.prometheusOperator.admissionWebhooks.patch.image.sha }} - image: {{ $registry }}/{{ .Values.prometheusOperator.admissionWebhooks.patch.image.repository }}:{{ .Values.prometheusOperator.admissionWebhooks.patch.image.tag }}@sha256:{{ .Values.prometheusOperator.admissionWebhooks.patch.image.sha }} - {{- else }} - image: {{ $registry }}/{{ .Values.prometheusOperator.admissionWebhooks.patch.image.repository }}:{{ .Values.prometheusOperator.admissionWebhooks.patch.image.tag }} - {{- end }} - imagePullPolicy: {{ .Values.prometheusOperator.admissionWebhooks.patch.image.pullPolicy }} - args: - - patch - - --webhook-name={{ template "kube-prometheus-stack.fullname" . }}-admission - - --namespace={{ template "kube-prometheus-stack.namespace" . }} - - --secret-name={{ template "kube-prometheus-stack.fullname" . }}-admission - - --patch-failure-policy={{ .Values.prometheusOperator.admissionWebhooks.failurePolicy }} - {{- with .Values.prometheusOperator.admissionWebhooks.patchWebhookJob }} - securityContext: - {{ toYaml .securityContext | nindent 12 }} - {{- end }} - resources: -{{ toYaml .Values.prometheusOperator.admissionWebhooks.patch.resources | indent 12 }} - restartPolicy: OnFailure - serviceAccountName: {{ template "kube-prometheus-stack.fullname" . }}-admission - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- with .Values.prometheusOperator.admissionWebhooks.patch.nodeSelector }} -{{ toYaml . | indent 8 }} -{{- end }} - {{- with .Values.prometheusOperator.admissionWebhooks.patch.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- with .Values.prometheusOperator.admissionWebhooks.patch.tolerations }} -{{ toYaml . | indent 8 }} - {{- end }} -{{- if .Values.prometheusOperator.admissionWebhooks.patch.securityContext }} - securityContext: -{{ toYaml .Values.prometheusOperator.admissionWebhooks.patch.securityContext | indent 8 }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/networkpolicy-createSecret.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/networkpolicy-createSecret.yaml deleted file mode 100644 index c739d6565a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/networkpolicy-createSecret.yaml +++ /dev/null @@ -1,29 +0,0 @@ -{{- if and .Values.prometheusOperator.networkPolicy.enabled (eq .Values.prometheusOperator.networkPolicy.flavor "kubernetes") }} -{{- if and .Values.prometheusOperator.enabled .Values.prometheusOperator.admissionWebhooks.enabled .Values.prometheusOperator.admissionWebhooks.patch.enabled (not .Values.prometheusOperator.admissionWebhooks.certManager.enabled) }} -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-admission-create - namespace: {{ template "kube-prometheus-stack.namespace" . }} - annotations: - "helm.sh/hook": pre-install,pre-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded - ## Ensure this is run before the job - "helm.sh/hook-weight": "-5" -{{- with .Values.prometheusOperator.admissionWebhooks.annotations }} -{{ toYaml . | indent 4 }} -{{- end }} - labels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission-create -{{- include "kube-prometheus-stack.labels" $ | indent 4 }} -spec: - podSelector: - matchLabels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission-create -{{- include "kube-prometheus-stack.labels" $ | indent 6 }} - egress: - - {} - policyTypes: - - Egress -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/networkpolicy-patchWebhook.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/networkpolicy-patchWebhook.yaml deleted file mode 100644 index f9cd6fbe85..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/networkpolicy-patchWebhook.yaml +++ /dev/null @@ -1,29 +0,0 @@ -{{- if and .Values.prometheusOperator.networkPolicy.enabled (eq .Values.prometheusOperator.networkPolicy.flavor "kubernetes") }} -{{- if and .Values.prometheusOperator.enabled .Values.prometheusOperator.admissionWebhooks.enabled .Values.prometheusOperator.admissionWebhooks.patch.enabled (not .Values.prometheusOperator.admissionWebhooks.certManager.enabled) }} -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-admission-patch - namespace: {{ template "kube-prometheus-stack.namespace" . }} - annotations: - "helm.sh/hook": post-install,post-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded - ## Ensure this is run before the job - "helm.sh/hook-weight": "-5" -{{- with .Values.prometheusOperator.admissionWebhooks.patch.annotations }} -{{ toYaml . | indent 4 }} -{{- end }} - labels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission-patch -{{- include "kube-prometheus-stack.labels" $ | indent 4 }} -spec: - podSelector: - matchLabels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission-patch -{{- include "kube-prometheus-stack.labels" $ | indent 6 }} - egress: - - {} - policyTypes: - - Egress -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/psp.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/psp.yaml deleted file mode 100644 index 07df21686a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/psp.yaml +++ /dev/null @@ -1,47 +0,0 @@ -{{- if and (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") .Values.prometheusOperator.enabled .Values.prometheusOperator.admissionWebhooks.enabled .Values.prometheusOperator.admissionWebhooks.patch.enabled (or .Values.global.cattle.psp.enabled (and .Values.global.rbac.create .Values.global.rbac.pspEnabled)) (not .Values.prometheusOperator.admissionWebhooks.certManager.enabled) }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-admission - annotations: - "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded -{{- if .Values.global.rbac.pspAnnotations }} -{{ toYaml .Values.global.rbac.pspAnnotations | indent 4 }} -{{- end }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-admission -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - privileged: false - # Allow core volume types. - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'secret' - - 'downwardAPI' - - 'persistentVolumeClaim' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - # Permits the container to run with root privileges as well. - rule: 'RunAsAny' - seLinux: - # This policy assumes the nodes are using AppArmor rather than SELinux. - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - # Allow adding the root group. - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - # Allow adding the root group. - - min: 0 - max: 65535 - readOnlyRootFilesystem: false -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/role.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/role.yaml deleted file mode 100644 index a64e982a3d..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/role.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if and .Values.prometheusOperator.enabled .Values.prometheusOperator.admissionWebhooks.enabled .Values.prometheusOperator.admissionWebhooks.patch.enabled .Values.global.rbac.create (not .Values.prometheusOperator.admissionWebhooks.certManager.enabled) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-admission - namespace: {{ template "kube-prometheus-stack.namespace" . }} - annotations: - "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded - labels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission -{{- include "kube-prometheus-stack.labels" $ | indent 4 }} -rules: - - apiGroups: - - "" - resources: - - secrets - verbs: - - get - - create -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/rolebinding.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/rolebinding.yaml deleted file mode 100644 index d713629834..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/rolebinding.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if and .Values.prometheusOperator.enabled .Values.prometheusOperator.admissionWebhooks.enabled .Values.prometheusOperator.admissionWebhooks.patch.enabled .Values.global.rbac.create (not .Values.prometheusOperator.admissionWebhooks.certManager.enabled) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-admission - namespace: {{ template "kube-prometheus-stack.namespace" . }} - annotations: - "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded - labels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission -{{- include "kube-prometheus-stack.labels" $ | indent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "kube-prometheus-stack.fullname" . }}-admission -subjects: - - kind: ServiceAccount - name: {{ template "kube-prometheus-stack.fullname" . }}-admission - namespace: {{ template "kube-prometheus-stack.namespace" . }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/serviceaccount.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/serviceaccount.yaml deleted file mode 100644 index 4fd52ae0a9..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/job-patch/serviceaccount.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if and .Values.prometheusOperator.enabled .Values.prometheusOperator.admissionWebhooks.enabled .Values.prometheusOperator.admissionWebhooks.patch.enabled .Values.global.rbac.create (not .Values.prometheusOperator.admissionWebhooks.certManager.enabled) }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-admission - namespace: {{ template "kube-prometheus-stack.namespace" . }} - annotations: - "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded - labels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission -{{- include "kube-prometheus-stack.labels" $ | indent 4 }} -{{- if .Values.global.imagePullSecrets }} -imagePullSecrets: -{{ include "kube-prometheus-stack.imagePullSecrets" . | trim | indent 2 }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/mutatingWebhookConfiguration.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/mutatingWebhookConfiguration.yaml deleted file mode 100644 index d8552140bb..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/mutatingWebhookConfiguration.yaml +++ /dev/null @@ -1,69 +0,0 @@ -{{- if and .Values.prometheusOperator.enabled .Values.prometheusOperator.admissionWebhooks.enabled }} -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-admission -{{- if .Values.prometheusOperator.admissionWebhooks.certManager.enabled }} - annotations: - certmanager.k8s.io/inject-ca-from: {{ printf "%s/%s-admission" (include "kube-prometheus-stack.namespace" .) (include "kube-prometheus-stack.fullname" .) | quote }} - cert-manager.io/inject-ca-from: {{ printf "%s/%s-admission" (include "kube-prometheus-stack.namespace" .) (include "kube-prometheus-stack.fullname" .) | quote }} -{{- end }} - labels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission -{{- include "kube-prometheus-stack.labels" $ | indent 4 }} -webhooks: - - name: prometheusrulemutate.monitoring.coreos.com - {{- if eq .Values.prometheusOperator.admissionWebhooks.failurePolicy "IgnoreOnInstallOnly" }} - failurePolicy: {{ .Release.IsInstall | ternary "Ignore" "Fail" }} - {{- else if .Values.prometheusOperator.admissionWebhooks.failurePolicy }} - failurePolicy: {{ .Values.prometheusOperator.admissionWebhooks.failurePolicy }} - {{- else if .Values.prometheusOperator.admissionWebhooks.patch.enabled }} - failurePolicy: Ignore - {{- else }} - failurePolicy: Fail - {{- end }} - rules: - - apiGroups: - - monitoring.coreos.com - apiVersions: - - "*" - resources: - - prometheusrules - operations: - - CREATE - - UPDATE - clientConfig: - service: - namespace: {{ template "kube-prometheus-stack.namespace" . }} - name: {{ template "kube-prometheus-stack.operator.fullname" $ }} - path: /admission-prometheusrules/mutate - {{- if and .Values.prometheusOperator.admissionWebhooks.caBundle (not .Values.prometheusOperator.admissionWebhooks.patch.enabled) (not .Values.prometheusOperator.admissionWebhooks.certManager.enabled) }} - caBundle: {{ .Values.prometheusOperator.admissionWebhooks.caBundle }} - {{- end }} - timeoutSeconds: {{ .Values.prometheusOperator.admissionWebhooks.timeoutSeconds }} - admissionReviewVersions: ["v1", "v1beta1"] - sideEffects: None - {{- if or .Values.prometheusOperator.denyNamespaces .Values.prometheusOperator.namespaces }} - namespaceSelector: - matchExpressions: - {{- if .Values.prometheusOperator.denyNamespaces }} - - key: kubernetes.io/metadata.name - operator: NotIn - values: - {{- range $namespace := mustUniq .Values.prometheusOperator.denyNamespaces }} - - {{ $namespace }} - {{- end }} - {{- else if and .Values.prometheusOperator.namespaces .Values.prometheusOperator.namespaces.additional }} - - key: kubernetes.io/metadata.name - operator: In - values: - {{- if and .Values.prometheusOperator.namespaces.releaseNamespace (default .Values.prometheusOperator.namespaces.releaseNamespace true) }} - {{- $namespace := printf "%s" (include "kube-prometheus-stack.namespace" .) }} - - {{ $namespace }} - {{- end }} - {{- range $namespace := mustUniq .Values.prometheusOperator.namespaces.additional }} - - {{ $namespace }} - {{- end }} - {{- end }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/validatingWebhookConfiguration.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/validatingWebhookConfiguration.yaml deleted file mode 100644 index ab66272675..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/admission-webhooks/validatingWebhookConfiguration.yaml +++ /dev/null @@ -1,69 +0,0 @@ -{{- if and .Values.prometheusOperator.enabled .Values.prometheusOperator.admissionWebhooks.enabled }} -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-admission -{{- if .Values.prometheusOperator.admissionWebhooks.certManager.enabled }} - annotations: - certmanager.k8s.io/inject-ca-from: {{ printf "%s/%s-admission" (include "kube-prometheus-stack.namespace" .) (include "kube-prometheus-stack.fullname" .) | quote }} - cert-manager.io/inject-ca-from: {{ printf "%s/%s-admission" (include "kube-prometheus-stack.namespace" .) (include "kube-prometheus-stack.fullname" .) | quote }} -{{- end }} - labels: - app: {{ template "kube-prometheus-stack.name" $ }}-admission -{{- include "kube-prometheus-stack.labels" $ | indent 4 }} -webhooks: - - name: prometheusrulemutate.monitoring.coreos.com - {{- if eq .Values.prometheusOperator.admissionWebhooks.failurePolicy "IgnoreOnInstallOnly" }} - failurePolicy: {{ .Release.IsInstall | ternary "Ignore" "Fail" }} - {{- else if .Values.prometheusOperator.admissionWebhooks.failurePolicy }} - failurePolicy: {{ .Values.prometheusOperator.admissionWebhooks.failurePolicy }} - {{- else if .Values.prometheusOperator.admissionWebhooks.patch.enabled }} - failurePolicy: Ignore - {{- else }} - failurePolicy: Fail - {{- end }} - rules: - - apiGroups: - - monitoring.coreos.com - apiVersions: - - "*" - resources: - - prometheusrules - operations: - - CREATE - - UPDATE - clientConfig: - service: - namespace: {{ template "kube-prometheus-stack.namespace" . }} - name: {{ template "kube-prometheus-stack.operator.fullname" $ }} - path: /admission-prometheusrules/validate - {{- if and .Values.prometheusOperator.admissionWebhooks.caBundle (not .Values.prometheusOperator.admissionWebhooks.patch.enabled) (not .Values.prometheusOperator.admissionWebhooks.certManager.enabled) }} - caBundle: {{ .Values.prometheusOperator.admissionWebhooks.caBundle }} - {{- end }} - timeoutSeconds: {{ .Values.prometheusOperator.admissionWebhooks.timeoutSeconds }} - admissionReviewVersions: ["v1", "v1beta1"] - sideEffects: None - {{- if or .Values.prometheusOperator.denyNamespaces .Values.prometheusOperator.namespaces }} - namespaceSelector: - matchExpressions: - {{- if .Values.prometheusOperator.denyNamespaces }} - - key: kubernetes.io/metadata.name - operator: NotIn - values: - {{- range $namespace := mustUniq .Values.prometheusOperator.denyNamespaces }} - - {{ $namespace }} - {{- end }} - {{- else if and .Values.prometheusOperator.namespaces .Values.prometheusOperator.namespaces.additional }} - - key: kubernetes.io/metadata.name - operator: In - values: - {{- if and .Values.prometheusOperator.namespaces.releaseNamespace (default .Values.prometheusOperator.namespaces.releaseNamespace true) }} - {{- $namespace := printf "%s" (include "kube-prometheus-stack.namespace" .) }} - - {{ $namespace }} - {{- end }} - {{- range $namespace := mustUniq .Values.prometheusOperator.namespaces.additional }} - - {{ $namespace }} - {{- end }} - {{- end }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/certmanager.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/certmanager.yaml deleted file mode 100644 index a1e06aec46..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/certmanager.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{- if .Values.prometheusOperator.admissionWebhooks.certManager.enabled -}} -{{- if not .Values.prometheusOperator.admissionWebhooks.certManager.issuerRef -}} -# Create a selfsigned Issuer, in order to create a root CA certificate for -# signing webhook serving certificates -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-self-signed-issuer - namespace: {{ template "kube-prometheus-stack.namespace" . }} -spec: - selfSigned: {} ---- -# Generate a CA Certificate used to sign certificates for the webhook -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-root-cert - namespace: {{ template "kube-prometheus-stack.namespace" . }} -spec: - secretName: {{ template "kube-prometheus-stack.fullname" . }}-root-cert - duration: {{ .Values.prometheusOperator.admissionWebhooks.certManager.rootCert.duration | default "43800h0m0s" | quote }} - issuerRef: - name: {{ template "kube-prometheus-stack.fullname" . }}-self-signed-issuer - commonName: "ca.webhook.kube-prometheus-stack" - isCA: true ---- -# Create an Issuer that uses the above generated CA certificate to issue certs -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-root-issuer - namespace: {{ template "kube-prometheus-stack.namespace" . }} -spec: - ca: - secretName: {{ template "kube-prometheus-stack.fullname" . }}-root-cert -{{- end }} ---- -# generate a server certificate for the apiservices to use -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-admission - namespace: {{ template "kube-prometheus-stack.namespace" . }} -spec: - secretName: {{ template "kube-prometheus-stack.fullname" . }}-admission - duration: {{ .Values.prometheusOperator.admissionWebhooks.certManager.admissionCert.duration | default "8760h0m0s" | quote }} - issuerRef: - {{- if .Values.prometheusOperator.admissionWebhooks.certManager.issuerRef }} - {{- toYaml .Values.prometheusOperator.admissionWebhooks.certManager.issuerRef | nindent 4 }} - {{- else }} - name: {{ template "kube-prometheus-stack.fullname" . }}-root-issuer - {{- end }} - dnsNames: - - {{ template "kube-prometheus-stack.operator.fullname" . }} - - {{ template "kube-prometheus-stack.operator.fullname" . }}.{{ template "kube-prometheus-stack.namespace" . }} - - {{ template "kube-prometheus-stack.operator.fullname" . }}.{{ template "kube-prometheus-stack.namespace" . }}.svc -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/ciliumnetworkpolicy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/ciliumnetworkpolicy.yaml deleted file mode 100644 index a598f7bfb5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/ciliumnetworkpolicy.yaml +++ /dev/null @@ -1,35 +0,0 @@ -{{- if and .Values.prometheusOperator.networkPolicy.enabled (eq .Values.prometheusOperator.networkPolicy.flavor "cilium") }} -apiVersion: cilium.io/v2 -kind: CiliumNetworkPolicy -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-operator - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-operator - {{- include "kube-prometheus-stack.labels" . | nindent 4 }} -spec: - endpointSelector: - matchLabels: - app: {{ template "kube-prometheus-stack.name" . }}-operator - {{- include "kube-prometheus-stack.labels" $ | nindent 6 }} - egress: - {{- if and .Values.prometheusOperator.networkPolicy.cilium .Values.prometheusOperator.networkPolicy.cilium.egress }} - {{ toYaml .Values.prometheusOperator.networkPolicy.cilium.egress | nindent 6 }} - {{- else }} - - toEntities: - - kube-apiserver - {{- end }} - ingress: - - toPorts: - - ports: - {{- if .Values.prometheusOperator.tls.enabled }} - - port: {{ .Values.prometheusOperator.tls.internalPort | quote }} - {{- else }} - - port: "8080" - {{- end }} - protocol: "TCP" - rules: - http: - - method: "GET" - path: "/metrics" -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/clusterrole.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/clusterrole.yaml deleted file mode 100644 index a6c5b29e3f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/clusterrole.yaml +++ /dev/null @@ -1,92 +0,0 @@ -{{- if and .Values.prometheusOperator.enabled .Values.global.rbac.create }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-operator - labels: - app: {{ template "kube-prometheus-stack.name" . }}-operator -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -rules: -- apiGroups: - - monitoring.coreos.com - resources: - - alertmanagers - - alertmanagers/status - - alertmanagers/finalizers - - alertmanagerconfigs - - prometheuses - - prometheuses/status - - prometheuses/finalizers - - thanosrulers - - thanosrulers/finalizers - - servicemonitors - - podmonitors - - probes - - prometheusrules - verbs: - - '*' -- apiGroups: - - apps - resources: - - statefulsets - verbs: - - '*' -- apiGroups: - - "" - resources: - - configmaps - - secrets - verbs: - - '*' -- apiGroups: - - "" - resources: - - pods - verbs: - - list - - delete -- apiGroups: - - "" - resources: - - services - - services/finalizers - - endpoints - verbs: - - get - - create - - update - - delete -- apiGroups: - - "" - resources: - - nodes - verbs: - - list - - watch -- apiGroups: - - "" - resources: - - namespaces - verbs: - - get - - list - - watch -- apiGroups: - - networking.k8s.io - resources: - - ingresses - verbs: - - get - - list - - watch -{{- if .Capabilities.APIVersions.Has "discovery.k8s.io/v1/EndpointSlice" }} -- apiGroups: - - discovery.k8s.io - resources: - - endpointslices - verbs: - - get - - list - - watch -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/clusterrolebinding.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/clusterrolebinding.yaml deleted file mode 100644 index c9ab0ab872..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/clusterrolebinding.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if and .Values.prometheusOperator.enabled .Values.global.rbac.create }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-operator - labels: - app: {{ template "kube-prometheus-stack.name" . }}-operator -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "kube-prometheus-stack.fullname" . }}-operator -subjects: -- kind: ServiceAccount - name: {{ template "kube-prometheus-stack.operator.serviceAccountName" . }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/deployment.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/deployment.yaml deleted file mode 100644 index 6599597cdb..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/deployment.yaml +++ /dev/null @@ -1,183 +0,0 @@ -{{- $namespace := printf "%s" (include "kube-prometheus-stack.namespace" .) }} -{{- $defaultKubeletSvcName := printf "%s-kubelet" (include "kube-prometheus-stack.fullname" .) }} -{{- if .Values.prometheusOperator.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-operator - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-operator -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.prometheusOperator.labels }} -{{ toYaml .Values.prometheusOperator.labels | indent 4 }} -{{- end }} -{{- if .Values.prometheusOperator.annotations }} - annotations: -{{ toYaml .Values.prometheusOperator.annotations | indent 4 }} -{{- end }} -spec: - replicas: 1 - selector: - matchLabels: - app: {{ template "kube-prometheus-stack.name" . }}-operator - release: {{ $.Release.Name | quote }} - template: - metadata: - labels: - app: {{ template "kube-prometheus-stack.name" . }}-operator -{{ include "kube-prometheus-stack.labels" . | indent 8 }} -{{- if .Values.prometheusOperator.podLabels }} -{{ toYaml .Values.prometheusOperator.podLabels | indent 8 }} -{{- end }} -{{- if .Values.prometheusOperator.podAnnotations }} - annotations: -{{ toYaml .Values.prometheusOperator.podAnnotations | indent 8 }} -{{- end }} - spec: - {{- if .Values.prometheusOperator.priorityClassName }} - priorityClassName: {{ .Values.prometheusOperator.priorityClassName }} - {{- end }} - containers: - - name: {{ template "kube-prometheus-stack.name" . }} - {{- $base_registry := (include "monitoring_registry" .) }} - {{- $configReloaderRegistry := $base_registry | default .Values.prometheusOperator.prometheusConfigReloader.image.registry -}} - {{- $operatorRegistry := $base_registry | default .Values.prometheusOperator.image.registry -}} - {{- $thanosRegistry := $base_registry | default .Values.prometheusOperator.thanosImage.registry -}} - {{- if .Values.prometheusOperator.image.sha }} - image: "{{ $operatorRegistry }}/{{ .Values.prometheusOperator.image.repository }}:{{ .Values.prometheusOperator.image.tag | default .Chart.AppVersion }}@sha256:{{ .Values.prometheusOperator.image.sha }}" - {{- else }} - image: "{{ $operatorRegistry }}/{{ .Values.prometheusOperator.image.repository }}:{{ .Values.prometheusOperator.image.tag | default .Chart.AppVersion }}" - {{- end }} - imagePullPolicy: "{{ .Values.prometheusOperator.image.pullPolicy }}" - args: - {{- if .Values.prometheusOperator.kubeletService.enabled }} - - --kubelet-service={{ .Values.prometheusOperator.kubeletService.namespace }}/{{ default $defaultKubeletSvcName .Values.prometheusOperator.kubeletService.name }} - {{- end }} - {{- if .Values.prometheusOperator.logFormat }} - - --log-format={{ .Values.prometheusOperator.logFormat }} - {{- end }} - {{- if .Values.prometheusOperator.logLevel }} - - --log-level={{ .Values.prometheusOperator.logLevel }} - {{- end }} - {{- if .Values.prometheusOperator.denyNamespaces }} - - --deny-namespaces={{ tpl (.Values.prometheusOperator.denyNamespaces | join ",") $ }} - {{- end }} - {{- with $.Values.prometheusOperator.namespaces }} - {{- $namespaces := list }} - {{- if .releaseNamespace }} - {{- $namespaces = append $namespaces $namespace }} - {{- end }} - {{- if .additional }} - {{- range $ns := .additional }} - {{- $namespaces = append $namespaces (tpl $ns $) }} - {{- end }} - {{- end }} - - --namespaces={{ $namespaces | mustUniq | join "," }} - {{- end }} - - --localhost=127.0.0.1 - {{- if .Values.prometheusOperator.prometheusDefaultBaseImage }} - - --prometheus-default-base-image={{ $base_registry | default .Values.prometheusOperator.prometheusDefaultBaseImageRegistry }}/{{ .Values.prometheusOperator.prometheusDefaultBaseImage }} - {{- end }} - {{- if .Values.prometheusOperator.alertmanagerDefaultBaseImage }} - - --alertmanager-default-base-image={{ $base_registry | default .Values.prometheusOperator.alertmanagerDefaultBaseImageRegistry }}/{{ .Values.prometheusOperator.alertmanagerDefaultBaseImage }} - {{- end }} - {{- if .Values.prometheusOperator.prometheusConfigReloader.image.sha }} - - --prometheus-config-reloader={{ $configReloaderRegistry }}/{{ .Values.prometheusOperator.prometheusConfigReloader.image.repository }}:{{ .Values.prometheusOperator.prometheusConfigReloader.image.tag | default .Chart.AppVersion }}@sha256:{{ .Values.prometheusOperator.prometheusConfigReloader.image.sha }} - {{- else }} - - --prometheus-config-reloader={{ $configReloaderRegistry }}/{{ .Values.prometheusOperator.prometheusConfigReloader.image.repository }}:{{ .Values.prometheusOperator.prometheusConfigReloader.image.tag | default .Chart.AppVersion }} - {{- end }} - - --config-reloader-cpu-request={{ .Values.prometheusOperator.prometheusConfigReloader.resources.requests.cpu }} - - --config-reloader-cpu-limit={{ .Values.prometheusOperator.prometheusConfigReloader.resources.limits.cpu }} - - --config-reloader-memory-request={{ .Values.prometheusOperator.prometheusConfigReloader.resources.requests.memory }} - - --config-reloader-memory-limit={{ .Values.prometheusOperator.prometheusConfigReloader.resources.limits.memory }} - {{- if .Values.prometheusOperator.prometheusConfigReloader.enableProbe }} - - --enable-config-reloader-probes=true - {{- end }} - {{- if .Values.prometheusOperator.alertmanagerInstanceNamespaces }} - - --alertmanager-instance-namespaces={{ .Values.prometheusOperator.alertmanagerInstanceNamespaces | join "," }} - {{- end }} - {{- if .Values.prometheusOperator.alertmanagerInstanceSelector }} - - --alertmanager-instance-selector={{ .Values.prometheusOperator.alertmanagerInstanceSelector }} - {{- end }} - {{- if .Values.prometheusOperator.alertmanagerConfigNamespaces }} - - --alertmanager-config-namespaces={{ .Values.prometheusOperator.alertmanagerConfigNamespaces | join "," }} - {{- end }} - {{- if .Values.prometheusOperator.prometheusInstanceNamespaces }} - - --prometheus-instance-namespaces={{ .Values.prometheusOperator.prometheusInstanceNamespaces | join "," }} - {{- end }} - {{- if .Values.prometheusOperator.prometheusInstanceSelector }} - - --prometheus-instance-selector={{ .Values.prometheusOperator.prometheusInstanceSelector }} - {{- end }} - {{- if .Values.prometheusOperator.thanosImage.sha }} - - --thanos-default-base-image={{ $thanosRegistry }}/{{ .Values.prometheusOperator.thanosImage.repository }}:{{ .Values.prometheusOperator.thanosImage.tag }}@sha256:{{ .Values.prometheusOperator.thanosImage.sha }} - {{- else }} - - --thanos-default-base-image={{ $thanosRegistry }}/{{ .Values.prometheusOperator.thanosImage.repository }}:{{ .Values.prometheusOperator.thanosImage.tag }} - {{- end }} - {{- if .Values.prometheusOperator.thanosRulerInstanceNamespaces }} - - --thanos-ruler-instance-namespaces={{ .Values.prometheusOperator.thanosRulerInstanceNamespaces | join "," }} - {{- end }} - {{- if .Values.prometheusOperator.thanosRulerInstanceSelector }} - - --thanos-ruler-instance-selector={{ .Values.prometheusOperator.thanosRulerInstanceSelector }} - {{- end }} - {{- if .Values.prometheusOperator.secretFieldSelector }} - - --secret-field-selector={{ tpl (.Values.prometheusOperator.secretFieldSelector) $ }} - {{- end }} - {{- if .Values.prometheusOperator.clusterDomain }} - - --cluster-domain={{ .Values.prometheusOperator.clusterDomain }} - {{- end }} - {{- if .Values.prometheusOperator.tls.enabled }} - - --web.enable-tls=true - - --web.cert-file=/cert/{{ if .Values.prometheusOperator.admissionWebhooks.certManager.enabled }}tls.crt{{ else }}cert{{ end }} - - --web.key-file=/cert/{{ if .Values.prometheusOperator.admissionWebhooks.certManager.enabled }}tls.key{{ else }}key{{ end }} - - --web.listen-address=:{{ .Values.prometheusOperator.tls.internalPort }} - - --web.tls-min-version={{ .Values.prometheusOperator.tls.tlsMinVersion }} - ports: - - containerPort: {{ .Values.prometheusOperator.tls.internalPort }} - name: https - {{- else }} - ports: - - containerPort: 8080 - name: http - {{- end }} - resources: -{{ toYaml .Values.prometheusOperator.resources | indent 12 }} - securityContext: -{{ toYaml .Values.prometheusOperator.containerSecurityContext | indent 12 }} -{{- if .Values.prometheusOperator.tls.enabled }} - volumeMounts: - - name: tls-secret - mountPath: /cert - readOnly: true - volumes: - - name: tls-secret - secret: - defaultMode: 420 - secretName: {{ template "kube-prometheus-stack.fullname" . }}-admission -{{- end }} - {{- with .Values.prometheusOperator.dnsConfig }} - dnsConfig: -{{ toYaml . | indent 8 }} - {{- end }} -{{- if .Values.prometheusOperator.securityContext }} - securityContext: -{{ toYaml .Values.prometheusOperator.securityContext | indent 8 }} -{{- end }} - serviceAccountName: {{ template "kube-prometheus-stack.operator.serviceAccountName" . }} -{{- if .Values.prometheusOperator.hostNetwork }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet -{{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} -{{- with .Values.prometheusOperator.nodeSelector }} -{{ toYaml . | indent 8 }} -{{- end }} - {{- with .Values.prometheusOperator.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} -{{- with .Values.prometheusOperator.tolerations }} -{{ toYaml . | indent 8 }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/networkpolicy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/networkpolicy.yaml deleted file mode 100644 index 95492a6e59..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/networkpolicy.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{- if and .Values.prometheusOperator.networkPolicy.enabled (eq .Values.prometheusOperator.networkPolicy.flavor "kubernetes") }} -apiVersion: {{ template "kube-prometheus-stack.prometheus.networkPolicy.apiVersion" . }} -kind: NetworkPolicy -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-operator - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-operator - {{- include "kube-prometheus-stack.labels" . | nindent 4 }} -spec: - egress: - - {} - ingress: - - ports: - {{- if .Values.prometheusOperator.tls.enabled }} - - port: {{ .Values.prometheusOperator.tls.internalPort }} - {{- else }} - - port: 8080 - {{- end }} - policyTypes: - - Egress - - Ingress - podSelector: - matchLabels: - app: {{ template "kube-prometheus-stack.name" . }}-operator - release: {{ $.Release.Name | quote }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/psp-clusterrole.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/psp-clusterrole.yaml deleted file mode 100644 index 45371ace01..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/psp-clusterrole.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- if .Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy" }} -{{- if and .Values.prometheusOperator.enabled (or .Values.global.cattle.psp.enabled (and .Values.global.rbac.create .Values.global.rbac.pspEnabled)) }} -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-operator-psp - labels: - app: {{ template "kube-prometheus-stack.name" . }}-operator -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -rules: -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if semverCompare "> 1.15.0-0" $kubeTargetVersion }} -- apiGroups: ['policy'] -{{- else }} -- apiGroups: ['extensions'] -{{- end }} - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "kube-prometheus-stack.fullname" . }}-operator -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/psp-clusterrolebinding.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/psp-clusterrolebinding.yaml deleted file mode 100644 index 7b7ad19845..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/psp-clusterrolebinding.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if and .Values.prometheusOperator.enabled (or .Values.global.cattle.psp.enabled (and .Values.global.rbac.create .Values.global.rbac.pspEnabled)) }} -{{- if .Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy" }} -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-operator-psp - labels: - app: {{ template "kube-prometheus-stack.name" . }}-operator -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "kube-prometheus-stack.fullname" . }}-operator-psp -subjects: - - kind: ServiceAccount - name: {{ template "kube-prometheus-stack.operator.serviceAccountName" . }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/psp.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/psp.yaml deleted file mode 100644 index 10eda7d162..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/psp.yaml +++ /dev/null @@ -1,47 +0,0 @@ -{{- if and .Values.prometheusOperator.enabled (or .Values.global.cattle.psp.enabled (and .Values.global.rbac.create .Values.global.rbac.pspEnabled)) }} -{{- if .Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy" }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-operator - labels: - app: {{ template "kube-prometheus-stack.name" . }}-operator -{{- if .Values.global.rbac.pspAnnotations }} - annotations: -{{ toYaml .Values.global.rbac.pspAnnotations | indent 4 }} -{{- end }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - privileged: false - # Allow core volume types. - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'secret' - - 'downwardAPI' - - 'persistentVolumeClaim' - hostNetwork: {{ .Values.prometheusOperator.hostNetwork }} - hostIPC: false - hostPID: false - runAsUser: - # Permits the container to run with root privileges as well. - rule: 'RunAsAny' - seLinux: - # This policy assumes the nodes are using AppArmor rather than SELinux. - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - # Allow adding the root group. - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - # Allow adding the root group. - - min: 0 - max: 65535 - readOnlyRootFilesystem: false -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/service.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/service.yaml deleted file mode 100644 index b5ef5b93d5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/service.yaml +++ /dev/null @@ -1,58 +0,0 @@ -{{- if .Values.prometheusOperator.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-operator - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-operator -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.prometheusOperator.service.labels }} -{{ toYaml .Values.prometheusOperator.service.labels | indent 4 }} -{{- end }} -{{- if .Values.prometheusOperator.service.annotations }} - annotations: -{{ toYaml .Values.prometheusOperator.service.annotations | indent 4 }} -{{- end }} -spec: -{{- if .Values.prometheusOperator.service.clusterIP }} - clusterIP: {{ .Values.prometheusOperator.service.clusterIP }} -{{- end }} -{{- if .Values.prometheusOperator.service.externalIPs }} - externalIPs: -{{ toYaml .Values.prometheusOperator.service.externalIPs | indent 4 }} -{{- end }} -{{- if .Values.prometheusOperator.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.prometheusOperator.service.loadBalancerIP }} -{{- end }} -{{- if .Values.prometheusOperator.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- range $cidr := .Values.prometheusOperator.service.loadBalancerSourceRanges }} - - {{ $cidr }} - {{- end }} -{{- end }} -{{- if ne .Values.prometheusOperator.service.type "ClusterIP" }} - externalTrafficPolicy: {{ .Values.prometheusOperator.service.externalTrafficPolicy }} -{{- end }} - ports: - {{- if not .Values.prometheusOperator.tls.enabled }} - - name: http - {{- if eq .Values.prometheusOperator.service.type "NodePort" }} - nodePort: {{ .Values.prometheusOperator.service.nodePort }} - {{- end }} - port: 8080 - targetPort: http - {{- end }} - {{- if .Values.prometheusOperator.tls.enabled }} - - name: https - {{- if eq .Values.prometheusOperator.service.type "NodePort"}} - nodePort: {{ .Values.prometheusOperator.service.nodePortTls }} - {{- end }} - port: 443 - targetPort: https - {{- end }} - selector: - app: {{ template "kube-prometheus-stack.name" . }}-operator - release: {{ $.Release.Name | quote }} - type: "{{ .Values.prometheusOperator.service.type }}" -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/serviceaccount.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/serviceaccount.yaml deleted file mode 100644 index 781975f32e..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/serviceaccount.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if and .Values.prometheusOperator.enabled .Values.prometheusOperator.serviceAccount.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "kube-prometheus-stack.operator.serviceAccountName" . }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-operator - app.kubernetes.io/name: {{ template "kube-prometheus-stack.name" . }}-prometheus-operator - app.kubernetes.io/component: prometheus-operator -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.global.imagePullSecrets }} -imagePullSecrets: -{{ include "kube-prometheus-stack.imagePullSecrets" . | trim | indent 2 }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/servicemonitor.yaml deleted file mode 100644 index 4fab19ec99..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/servicemonitor.yaml +++ /dev/null @@ -1,58 +0,0 @@ -{{- if and .Values.prometheusOperator.enabled .Values.prometheusOperator.serviceMonitor.selfMonitor }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-operator - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-operator -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- with .Values.prometheusOperator.serviceMonitor.additionalLabels }} -{{ toYaml . | indent 4 }} -{{- end }} -spec: - {{- include "servicemonitor.scrapeLimits" .Values.prometheusOperator.serviceMonitor | nindent 2 }} - endpoints: - {{- if .Values.prometheusOperator.tls.enabled }} - - port: https - scheme: https - tlsConfig: - serverName: {{ template "kube-prometheus-stack.operator.fullname" . }} - ca: - secret: - name: {{ template "kube-prometheus-stack.fullname" . }}-admission - key: {{ if .Values.prometheusOperator.admissionWebhooks.certManager.enabled }}ca.crt{{ else }}ca{{ end }} - optional: false - {{- else }} - - port: http - {{- end }} - honorLabels: true - {{- if .Values.prometheusOperator.serviceMonitor.interval }} - interval: {{ .Values.prometheusOperator.serviceMonitor.interval }} - {{- end }} - metricRelabelings: - {{- if .Values.prometheusOperator.serviceMonitor.metricRelabelings }} - {{ tpl (toYaml .Values.prometheusOperator.serviceMonitor.metricRelabelings | indent 6) . }} - {{- end }} - {{ if .Values.global.cattle.clusterId }} - - sourceLabels: [__address__] - targetLabel: cluster_id - replacement: {{ .Values.global.cattle.clusterId }} - {{- end }} - {{ if .Values.global.cattle.clusterName}} - - sourceLabels: [__address__] - targetLabel: cluster_name - replacement: {{ .Values.global.cattle.clusterName }} - {{- end }} -{{- if .Values.prometheusOperator.serviceMonitor.relabelings }} - relabelings: -{{ toYaml .Values.prometheusOperator.serviceMonitor.relabelings | indent 6 }} -{{- end }} - selector: - matchLabels: - app: {{ template "kube-prometheus-stack.name" . }}-operator - release: {{ $.Release.Name | quote }} - namespaceSelector: - matchNames: - - {{ printf "%s" (include "kube-prometheus-stack.namespace" .) | quote }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/verticalpodautoscaler.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/verticalpodautoscaler.yaml deleted file mode 100644 index fe2c68ed5d..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus-operator/verticalpodautoscaler.yaml +++ /dev/null @@ -1,35 +0,0 @@ -{{- if and (.Capabilities.APIVersions.Has "autoscaling.k8s.io/v1") (.Values.prometheusOperator.verticalPodAutoscaler.enabled) }} -apiVersion: autoscaling.k8s.io/v1 -kind: VerticalPodAutoscaler -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-operator - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-operator -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - resourcePolicy: - containerPolicies: - - containerName: {{ template "kube-prometheus-stack.name" . }} - {{- if .Values.prometheusOperator.verticalPodAutoscaler.controlledResources }} - controlledResources: {{ .Values.prometheusOperator.verticalPodAutoscaler.controlledResources }} - {{- end }} - {{- if .Values.prometheusOperator.verticalPodAutoscaler.maxAllowed }} - maxAllowed: - {{- toYaml .Values.prometheusOperator.verticalPodAutoscaler.maxAllowed | nindent 8 }} - {{- end }} - {{- if .Values.prometheusOperator.verticalPodAutoscaler.minAllowed }} - minAllowed: - {{- toYaml .Values.prometheusOperator.verticalPodAutoscaler.minAllowed | nindent 8 }} - {{- end }} - targetRef: - apiVersion: apps/v1 - kind: Deployment - name: {{ template "kube-prometheus-stack.fullname" . }}-operator - {{- if .Values.prometheusOperator.verticalPodAutoscaler.updatePolicy }} - updatePolicy: - {{- if .Values.prometheusOperator.verticalPodAutoscaler.updatePolicy.updateMode }} - updateMode: {{ .Values.prometheusOperator.verticalPodAutoscaler.updatePolicy.updateMode }} - {{- end }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/_rules.tpl b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/_rules.tpl deleted file mode 100644 index e8baf98e47..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/_rules.tpl +++ /dev/null @@ -1,36 +0,0 @@ -{{- /* -Generated file. Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- define "rules.names" }} -rules: - - "alertmanager.rules" - - "config-reloaders" - - "etcd" - - "general.rules" - - "k8s.rules" - - "kube-apiserver-availability.rules" - - "kube-apiserver-burnrate.rules" - - "kube-apiserver-histogram.rules" - - "kube-apiserver-slos" - - "kube-prometheus-general.rules" - - "kube-prometheus-node-recording.rules" - - "kube-scheduler.rules" - - "kube-state-metrics" - - "kubelet.rules" - - "kubernetes-apps" - - "kubernetes-resources" - - "kubernetes-storage" - - "kubernetes-system" - - "kubernetes-system-kube-proxy" - - "kubernetes-system-apiserver" - - "kubernetes-system-kubelet" - - "kubernetes-system-controller-manager" - - "kubernetes-system-scheduler" - - "node-exporter.rules" - - "node-exporter" - - "node.rules" - - "node-network" - - "prometheus-operator" - - "prometheus" -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/additionalAlertRelabelConfigs.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/additionalAlertRelabelConfigs.yaml deleted file mode 100644 index bff930981a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/additionalAlertRelabelConfigs.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if and .Values.prometheus.enabled .Values.prometheus.prometheusSpec.additionalAlertRelabelConfigs }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus-am-relabel-confg - namespace: {{ template "kube-prometheus-stack.namespace" . }} -{{- if .Values.prometheus.prometheusSpec.additionalPrometheusSecretsAnnotations }} - annotations: -{{ toYaml .Values.prometheus.prometheusSpec.additionalPrometheusSecretsAnnotations | indent 4 }} -{{- end }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus-am-relabel-confg -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -data: - additional-alert-relabel-configs.yaml: {{ toYaml .Values.prometheus.prometheusSpec.additionalAlertRelabelConfigs | b64enc | quote }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/additionalAlertmanagerConfigs.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/additionalAlertmanagerConfigs.yaml deleted file mode 100644 index 2fe8fdb816..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/additionalAlertmanagerConfigs.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if and .Values.prometheus.enabled .Values.prometheus.prometheusSpec.additionalAlertManagerConfigs }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus-am-confg - namespace: {{ template "kube-prometheus-stack.namespace" . }} -{{- if .Values.prometheus.prometheusSpec.additionalPrometheusSecretsAnnotations }} - annotations: -{{ toYaml .Values.prometheus.prometheusSpec.additionalPrometheusSecretsAnnotations | indent 4 }} -{{- end }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus-am-confg -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -data: - additional-alertmanager-configs.yaml: {{ tpl (toYaml .Values.prometheus.prometheusSpec.additionalAlertManagerConfigs) . | b64enc | quote }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/additionalPrometheusRules.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/additionalPrometheusRules.yaml deleted file mode 100644 index cb4aabaa7b..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/additionalPrometheusRules.yaml +++ /dev/null @@ -1,43 +0,0 @@ -{{- if or .Values.additionalPrometheusRules .Values.additionalPrometheusRulesMap}} -apiVersion: v1 -kind: List -metadata: - name: {{ include "kube-prometheus-stack.fullname" $ }}-additional-prometheus-rules - namespace: {{ template "kube-prometheus-stack.namespace" . }} -items: -{{- if .Values.additionalPrometheusRulesMap }} -{{- range $prometheusRuleName, $prometheusRule := .Values.additionalPrometheusRulesMap }} - - apiVersion: monitoring.coreos.com/v1 - kind: PrometheusRule - metadata: - name: {{ template "kube-prometheus-stack.name" $ }}-{{ $prometheusRuleName }} - namespace: {{ template "kube-prometheus-stack.namespace" $ }} - labels: - app: {{ template "kube-prometheus-stack.name" $ }} -{{ include "kube-prometheus-stack.labels" $ | indent 8 }} - {{- if $prometheusRule.additionalLabels }} -{{ toYaml $prometheusRule.additionalLabels | indent 8 }} - {{- end }} - spec: - groups: -{{ toYaml $prometheusRule.groups| indent 8 }} -{{- end }} -{{- else }} -{{- range .Values.additionalPrometheusRules }} - - apiVersion: monitoring.coreos.com/v1 - kind: PrometheusRule - metadata: - name: {{ template "kube-prometheus-stack.name" $ }}-{{ .name }} - namespace: {{ template "kube-prometheus-stack.namespace" $ }} - labels: - app: {{ template "kube-prometheus-stack.name" $ }} -{{ include "kube-prometheus-stack.labels" $ | indent 8 }} - {{- if .additionalLabels }} -{{ toYaml .additionalLabels | indent 8 }} - {{- end }} - spec: - groups: -{{ toYaml .groups| indent 8 }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/additionalScrapeConfigs.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/additionalScrapeConfigs.yaml deleted file mode 100644 index ebdf766fde..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/additionalScrapeConfigs.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if and .Values.prometheus.enabled .Values.prometheus.prometheusSpec.additionalScrapeConfigs }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus-scrape-confg - namespace: {{ template "kube-prometheus-stack.namespace" . }} -{{- if .Values.prometheus.prometheusSpec.additionalPrometheusSecretsAnnotations }} - annotations: -{{ toYaml .Values.prometheus.prometheusSpec.additionalPrometheusSecretsAnnotations | indent 4 }} -{{- end }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus-scrape-confg -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -data: -{{- if eq ( typeOf .Values.prometheus.prometheusSpec.additionalScrapeConfigs ) "string" }} - additional-scrape-configs.yaml: {{ tpl .Values.prometheus.prometheusSpec.additionalScrapeConfigs $ | b64enc | quote }} -{{- else }} - additional-scrape-configs.yaml: {{ tpl (toYaml .Values.prometheus.prometheusSpec.additionalScrapeConfigs) $ | b64enc | quote }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/ciliumnetworkpolicy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/ciliumnetworkpolicy.yaml deleted file mode 100644 index 74d61d7c13..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/ciliumnetworkpolicy.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{- if and .Values.prometheus.networkPolicy.enabled (eq .Values.prometheus.networkPolicy.flavor "cilium") }} -apiVersion: cilium.io/v2 -kind: CiliumNetworkPolicy -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus - {{- include "kube-prometheus-stack.labels" . | nindent 4 }} -spec: - endpointSelector: - {{- if .Values.prometheus.networkPolicy.cilium.endpointSelector }} - {{- toYaml .Values.prometheus.networkPolicy.cilium.endpointSelector | nindent 4 }} - {{- else }} - matchExpressions: - - {key: app.kubernetes.io/name, operator: In, values: [prometheus]} - - {key: prometheus, operator: In, values: [{{ template "kube-prometheus-stack.prometheus.crname" . }}]} - {{- end }} - {{- if and .Values.prometheus.networkPolicy.cilium .Values.prometheus.networkPolicy.cilium.egress }} - egress: - {{ toYaml .Values.prometheus.networkPolicy.cilium.egress | nindent 4 }} - {{- end }} - {{- if and .Values.prometheus.networkPolicy.cilium .Values.prometheus.networkPolicy.cilium.ingress }} - ingress: - {{ toYaml .Values.prometheus.networkPolicy.cilium.ingress | nindent 4 }} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/clusterrole.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/clusterrole.yaml deleted file mode 100644 index 3585b5db11..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/clusterrole.yaml +++ /dev/null @@ -1,30 +0,0 @@ -{{- if and .Values.prometheus.enabled .Values.global.rbac.create }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -rules: -# This permission are not in the kube-prometheus repo -# they're grabbed from https://github.com/prometheus/prometheus/blob/master/documentation/examples/rbac-setup.yml -- apiGroups: [""] - resources: - - nodes - - nodes/metrics - - services - - endpoints - - pods - verbs: ["get", "list", "watch"] -- apiGroups: - - "networking.k8s.io" - resources: - - ingresses - verbs: ["get", "list", "watch"] -- nonResourceURLs: ["/metrics", "/metrics/cadvisor"] - verbs: ["get"] -{{- if .Values.prometheus.additionalRulesForClusterRole }} -{{ toYaml .Values.prometheus.additionalRulesForClusterRole | indent 0 }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/clusterrolebinding.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/clusterrolebinding.yaml deleted file mode 100644 index 9fc4f65da4..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/clusterrolebinding.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- if and .Values.prometheus.enabled .Values.global.rbac.create }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus -subjects: - - kind: ServiceAccount - name: {{ template "kube-prometheus-stack.prometheus.serviceAccountName" . }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} -{{- end }} - diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/csi-secret.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/csi-secret.yaml deleted file mode 100644 index e05382f633..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/csi-secret.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if and .Values.prometheus.prometheusSpec.thanos .Values.prometheus.prometheusSpec.thanos.secretProviderClass }} ---- -apiVersion: secrets-store.csi.x-k8s.io/v1alpha1 -kind: SecretProviderClass -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus -spec: -{{ toYaml .Values.prometheus.prometheusSpec.thanos.secretProviderClass | indent 2 }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/extrasecret.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/extrasecret.yaml deleted file mode 100644 index 17f3478a46..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/extrasecret.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.prometheus.extraSecret.data -}} -{{- $secretName := printf "prometheus-%s-extra" (include "kube-prometheus-stack.fullname" . ) -}} -apiVersion: v1 -kind: Secret -metadata: - name: {{ default $secretName .Values.prometheus.extraSecret.name }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} -{{- if .Values.prometheus.extraSecret.annotations }} - annotations: -{{ toYaml .Values.prometheus.extraSecret.annotations | indent 4 }} -{{- end }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus - app.kubernetes.io/component: prometheus -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -data: -{{- range $key, $val := .Values.prometheus.extraSecret.data }} - {{ $key }}: {{ $val | b64enc | quote }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/ingress.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/ingress.yaml deleted file mode 100644 index 91fadf905f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/ingress.yaml +++ /dev/null @@ -1,77 +0,0 @@ -{{- if and .Values.prometheus.enabled .Values.prometheus.ingress.enabled -}} - {{- $pathType := .Values.prometheus.ingress.pathType | default "ImplementationSpecific" -}} - {{- $serviceName := printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "prometheus" -}} - {{- $servicePort := .Values.prometheus.ingress.servicePort | default .Values.prometheus.service.port -}} - {{- $routePrefix := list .Values.prometheus.prometheusSpec.routePrefix -}} - {{- $paths := .Values.prometheus.ingress.paths | default $routePrefix -}} - {{- $apiIsStable := eq (include "kube-prometheus-stack.ingress.isStable" .) "true" -}} - {{- $ingressSupportsPathType := eq (include "kube-prometheus-stack.ingress.supportsPathType" .) "true" -}} -apiVersion: {{ include "kube-prometheus-stack.ingress.apiVersion" . }} -kind: Ingress -metadata: -{{- if .Values.prometheus.ingress.annotations }} - annotations: -{{ toYaml .Values.prometheus.ingress.annotations | indent 4 }} -{{- end }} - name: {{ $serviceName }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.prometheus.ingress.labels }} -{{ toYaml .Values.prometheus.ingress.labels | indent 4 }} -{{- end }} -spec: - {{- if $apiIsStable }} - {{- if .Values.prometheus.ingress.ingressClassName }} - ingressClassName: {{ .Values.prometheus.ingress.ingressClassName }} - {{- end }} - {{- end }} - rules: - {{- if .Values.prometheus.ingress.hosts }} - {{- range $host := .Values.prometheus.ingress.hosts }} - - host: {{ tpl $host $ }} - http: - paths: - {{- range $p := $paths }} - - path: {{ tpl $p $ }} - {{- if and $pathType $ingressSupportsPathType }} - pathType: {{ $pathType }} - {{- end }} - backend: - {{- if $apiIsStable }} - service: - name: {{ $serviceName }} - port: - number: {{ $servicePort }} - {{- else }} - serviceName: {{ $serviceName }} - servicePort: {{ $servicePort }} - {{- end }} - {{- end -}} - {{- end -}} - {{- else }} - - http: - paths: - {{- range $p := $paths }} - - path: {{ tpl $p $ }} - {{- if and $pathType $ingressSupportsPathType }} - pathType: {{ $pathType }} - {{- end }} - backend: - {{- if $apiIsStable }} - service: - name: {{ $serviceName }} - port: - number: {{ $servicePort }} - {{- else }} - serviceName: {{ $serviceName }} - servicePort: {{ $servicePort }} - {{- end }} - {{- end -}} - {{- end -}} - {{- if .Values.prometheus.ingress.tls }} - tls: -{{ tpl (toYaml .Values.prometheus.ingress.tls | indent 4) . }} - {{- end -}} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/ingressThanosSidecar.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/ingressThanosSidecar.yaml deleted file mode 100644 index 10623cb41d..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/ingressThanosSidecar.yaml +++ /dev/null @@ -1,77 +0,0 @@ -{{- if and .Values.prometheus.enabled .Values.prometheus.thanosIngress.enabled }} -{{- $pathType := .Values.prometheus.thanosIngress.pathType | default "" }} -{{- $serviceName := printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "prometheus" }} -{{- $thanosPort := .Values.prometheus.thanosIngress.servicePort -}} -{{- $routePrefix := list .Values.prometheus.prometheusSpec.routePrefix }} -{{- $paths := .Values.prometheus.thanosIngress.paths | default $routePrefix -}} -{{- $apiIsStable := eq (include "kube-prometheus-stack.ingress.isStable" .) "true" -}} -{{- $ingressSupportsPathType := eq (include "kube-prometheus-stack.ingress.supportsPathType" .) "true" -}} -apiVersion: {{ include "kube-prometheus-stack.ingress.apiVersion" . }} -kind: Ingress -metadata: -{{- if .Values.prometheus.thanosIngress.annotations }} - annotations: -{{ toYaml .Values.prometheus.thanosIngress.annotations | indent 4 }} -{{- end }} - name: {{ template "kube-prometheus-stack.fullname" . }}-thanos-gateway - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.prometheus.thanosIngress.labels }} -{{ toYaml .Values.prometheus.thanosIngress.labels | indent 4 }} -{{- end }} -spec: - {{- if $apiIsStable }} - {{- if .Values.prometheus.thanosIngress.ingressClassName }} - ingressClassName: {{ .Values.prometheus.thanosIngress.ingressClassName }} - {{- end }} - {{- end }} - rules: - {{- if .Values.prometheus.thanosIngress.hosts }} - {{- range $host := .Values.prometheus.thanosIngress.hosts }} - - host: {{ tpl $host $ }} - http: - paths: - {{- range $p := $paths }} - - path: {{ tpl $p $ }} - {{- if and $pathType $ingressSupportsPathType }} - pathType: {{ $pathType }} - {{- end }} - backend: - {{- if $apiIsStable }} - service: - name: {{ $serviceName }} - port: - number: {{ $thanosPort }} - {{- else }} - serviceName: {{ $serviceName }} - servicePort: {{ $thanosPort }} - {{- end }} - {{- end -}} - {{- end -}} - {{- else }} - - http: - paths: - {{- range $p := $paths }} - - path: {{ tpl $p $ }} - {{- if and $pathType $ingressSupportsPathType }} - pathType: {{ $pathType }} - {{- end }} - backend: - {{- if $apiIsStable }} - service: - name: {{ $serviceName }} - port: - number: {{ $thanosPort }} - {{- else }} - serviceName: {{ $serviceName }} - servicePort: {{ $thanosPort }} - {{- end }} - {{- end -}} - {{- end -}} - {{- if .Values.prometheus.thanosIngress.tls }} - tls: -{{ tpl (toYaml .Values.prometheus.thanosIngress.tls | indent 4) . }} - {{- end -}} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/ingressperreplica.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/ingressperreplica.yaml deleted file mode 100644 index df631993ba..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/ingressperreplica.yaml +++ /dev/null @@ -1,67 +0,0 @@ -{{- if and .Values.prometheus.enabled .Values.prometheus.servicePerReplica.enabled .Values.prometheus.ingressPerReplica.enabled }} -{{- $pathType := .Values.prometheus.ingressPerReplica.pathType | default "" }} -{{- $count := .Values.prometheus.prometheusSpec.replicas | int -}} -{{- $servicePort := .Values.prometheus.servicePerReplica.port -}} -{{- $ingressValues := .Values.prometheus.ingressPerReplica -}} -{{- $apiIsStable := eq (include "kube-prometheus-stack.ingress.isStable" .) "true" -}} -{{- $ingressSupportsPathType := eq (include "kube-prometheus-stack.ingress.supportsPathType" .) "true" -}} -apiVersion: v1 -kind: List -metadata: - name: {{ include "kube-prometheus-stack.fullname" $ }}-prometheus-ingressperreplica - namespace: {{ template "kube-prometheus-stack.namespace" $ }} -items: -{{ range $i, $e := until $count }} - - kind: Ingress - apiVersion: {{ include "kube-prometheus-stack.ingress.apiVersion" $ }} - metadata: - name: {{ include "kube-prometheus-stack.fullname" $ }}-prometheus-{{ $i }} - namespace: {{ template "kube-prometheus-stack.namespace" $ }} - labels: - app: {{ include "kube-prometheus-stack.name" $ }}-prometheus - {{ include "kube-prometheus-stack.labels" $ | indent 8 }} - {{- if $ingressValues.labels }} -{{ toYaml $ingressValues.labels | indent 8 }} - {{- end }} - {{- if $ingressValues.annotations }} - annotations: -{{ toYaml $ingressValues.annotations | indent 8 }} - {{- end }} - spec: - {{- if $apiIsStable }} - {{- if $ingressValues.ingressClassName }} - ingressClassName: {{ $ingressValues.ingressClassName }} - {{- end }} - {{- end }} - rules: - - host: {{ $ingressValues.hostPrefix }}-{{ $i }}.{{ $ingressValues.hostDomain }} - http: - paths: - {{- range $p := $ingressValues.paths }} - - path: {{ tpl $p $ }} - {{- if and $pathType $ingressSupportsPathType }} - pathType: {{ $pathType }} - {{- end }} - backend: - {{- if $apiIsStable }} - service: - name: {{ include "kube-prometheus-stack.fullname" $ }}-prometheus-{{ $i }} - port: - number: {{ $servicePort }} - {{- else }} - serviceName: {{ include "kube-prometheus-stack.fullname" $ }}-prometheus-{{ $i }} - servicePort: {{ $servicePort }} - {{- end }} - {{- end -}} - {{- if or $ingressValues.tlsSecretName $ingressValues.tlsSecretPerReplica.enabled }} - tls: - - hosts: - - {{ $ingressValues.hostPrefix }}-{{ $i }}.{{ $ingressValues.hostDomain }} - {{- if $ingressValues.tlsSecretPerReplica.enabled }} - secretName: {{ $ingressValues.tlsSecretPerReplica.prefix }}-{{ $i }} - {{- else }} - secretName: {{ $ingressValues.tlsSecretName }} - {{- end }} - {{- end }} -{{- end -}} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/networkpolicy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/networkpolicy.yaml deleted file mode 100644 index 5cb2feb5e0..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/networkpolicy.yaml +++ /dev/null @@ -1,30 +0,0 @@ -{{- if and .Values.prometheus.networkPolicy.enabled (eq .Values.prometheus.networkPolicy.flavor "kubernetes") }} -apiVersion: {{ template "kube-prometheus-stack.prometheus.networkPolicy.apiVersion" . }} -kind: NetworkPolicy -metadata: - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus - {{- include "kube-prometheus-stack.labels" . | nindent 4 }} - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus - namespace: {{ template "kube-prometheus-stack.namespace" . }} -spec: - {{- if .Values.prometheus.networkPolicy.egress }} - egress: - {{- toYaml .Values.prometheus.networkPolicy.egress | nindent 4 }} - {{- end }} - {{- if .Values.prometheus.networkPolicy.ingress }} - ingress: - {{- toYaml .Values.prometheus.networkPolicy.ingress | nindent 4 }} - {{- end }} - policyTypes: - - Egress - - Ingress - podSelector: - {{- if .Values.prometheus.networkPolicy.podSelector }} - {{- toYaml .Values.prometheus.networkPolicy.podSelector | nindent 4 }} - {{- else }} - matchExpressions: - - {key: app.kubernetes.io/name, operator: In, values: [prometheus]} - - {key: prometheus, operator: In, values: [{{ template "kube-prometheus-stack.prometheus.crname" . }}]} - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/nginx-config.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/nginx-config.yaml deleted file mode 100644 index e4d91f9a9e..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/nginx-config.yaml +++ /dev/null @@ -1,68 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: prometheus-nginx-proxy-config - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.prometheus.annotations }} - annotations: -{{ toYaml .Values.prometheus.annotations | indent 4 }} -{{- end }} -data: - nginx.conf: |- - worker_processes auto; - error_log /dev/stdout warn; - pid /var/cache/nginx/nginx.pid; - - events { - worker_connections 1024; - } - - http { - include /etc/nginx/mime.types; - log_format main '[$time_local - $status] $remote_addr - $remote_user $request ($http_referer)'; - - proxy_connect_timeout 10; - proxy_read_timeout 180; - proxy_send_timeout 5; - proxy_buffering off; - proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=my_zone:100m inactive=1d max_size=10g; - - server { - listen 8081; - access_log off; - - gzip on; - gzip_min_length 1k; - gzip_comp_level 2; - gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript image/jpeg image/gif image/png; - gzip_vary on; - gzip_disable "MSIE [1-6]\."; - - proxy_set_header Host $host; - - location / { - proxy_cache my_zone; - proxy_cache_valid 200 302 1d; - proxy_cache_valid 301 30d; - proxy_cache_valid any 5m; - proxy_cache_bypass $http_cache_control; - add_header X-Proxy-Cache $upstream_cache_status; - add_header Cache-Control "public"; - - proxy_pass http://localhost:9090/; - - sub_filter_once off; - sub_filter 'var PATH_PREFIX = "";' 'var PATH_PREFIX = ".";'; - - if ($request_filename ~ .*\.(?:js|css|jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm)$) { - expires 90d; - } - - rewrite ^/k8s/clusters/.*/proxy(.*) /$1 break; - - } - } - } diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/podDisruptionBudget.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/podDisruptionBudget.yaml deleted file mode 100644 index 02a320eff4..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/podDisruptionBudget.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if and .Values.prometheus.enabled .Values.prometheus.podDisruptionBudget.enabled }} -apiVersion: {{ include "kube-prometheus-stack.pdb.apiVersion" . }} -kind: PodDisruptionBudget -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - {{- if .Values.prometheus.podDisruptionBudget.minAvailable }} - minAvailable: {{ .Values.prometheus.podDisruptionBudget.minAvailable }} - {{- end }} - {{- if .Values.prometheus.podDisruptionBudget.maxUnavailable }} - maxUnavailable: {{ .Values.prometheus.podDisruptionBudget.maxUnavailable }} - {{- end }} - selector: - matchLabels: - app.kubernetes.io/name: prometheus - prometheus: {{ template "kube-prometheus-stack.prometheus.crname" . }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/podmonitors.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/podmonitors.yaml deleted file mode 100644 index 4e748c23b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/podmonitors.yaml +++ /dev/null @@ -1,38 +0,0 @@ -{{- if and .Values.prometheus.enabled .Values.prometheus.additionalPodMonitors }} -apiVersion: v1 -kind: List -items: -{{- range .Values.prometheus.additionalPodMonitors }} - - apiVersion: monitoring.coreos.com/v1 - kind: PodMonitor - metadata: - name: {{ .name }} - namespace: {{ template "kube-prometheus-stack.namespace" $ }} - labels: - app: {{ template "kube-prometheus-stack.name" $ }}-prometheus -{{ include "kube-prometheus-stack.labels" $ | indent 8 }} - {{- if .additionalLabels }} -{{ toYaml .additionalLabels | indent 8 }} - {{- end }} - spec: - {{- include "servicemonitor.scrapeLimits" . | nindent 6 }} - podMetricsEndpoints: -{{ toYaml .podMetricsEndpoints | indent 8 }} - {{- if .jobLabel }} - jobLabel: {{ .jobLabel }} - {{- end }} - {{- if .namespaceSelector }} - namespaceSelector: -{{ toYaml .namespaceSelector | indent 8 }} - {{- end }} - selector: -{{ toYaml .selector | indent 8 }} - {{- if .podTargetLabels }} - podTargetLabels: -{{ toYaml .podTargetLabels | indent 8 }} - {{- end }} - {{- if .sampleLimit }} - sampleLimit: {{ .sampleLimit }} - {{- end }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/prometheus.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/prometheus.yaml deleted file mode 100644 index 863ad4099b..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/prometheus.yaml +++ /dev/null @@ -1,404 +0,0 @@ -{{- if .Values.prometheus.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: Prometheus -metadata: - name: {{ template "kube-prometheus-stack.prometheus.crname" . }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.prometheus.annotations }} - annotations: -{{ toYaml .Values.prometheus.annotations | indent 4 }} -{{- end }} -spec: -{{- if or .Values.prometheus.prometheusSpec.alertingEndpoints .Values.alertmanager.enabled }} - alerting: - alertmanagers: -{{- if .Values.prometheus.prometheusSpec.alertingEndpoints }} -{{ toYaml .Values.prometheus.prometheusSpec.alertingEndpoints | indent 6 }} -{{- else if .Values.alertmanager.enabled }} - - namespace: {{ template "kube-prometheus-stack.namespace" . }} - name: {{ template "kube-prometheus-stack.fullname" . }}-alertmanager - port: {{ .Values.alertmanager.alertmanagerSpec.portName }} - {{- if .Values.alertmanager.alertmanagerSpec.routePrefix }} - pathPrefix: "{{ .Values.alertmanager.alertmanagerSpec.routePrefix }}" - {{- end }} - apiVersion: {{ .Values.alertmanager.apiVersion }} -{{- end }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.apiserverConfig }} - apiserverConfig: -{{ toYaml .Values.prometheus.prometheusSpec.apiserverConfig | indent 4}} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.image }} - {{- $registry := include "monitoring_registry" . | default .Values.prometheus.prometheusSpec.image.registry -}} - {{- if and .Values.prometheus.prometheusSpec.image.tag .Values.prometheus.prometheusSpec.image.sha }} - image: "{{ $registry }}/{{ .Values.prometheus.prometheusSpec.image.repository }}:{{ .Values.prometheus.prometheusSpec.image.tag }}@sha256:{{ .Values.prometheus.prometheusSpec.image.sha }}" - {{- else if .Values.prometheus.prometheusSpec.image.sha }} - image: "{{ $registry }}/{{ .Values.prometheus.prometheusSpec.image.repository }}@sha256:{{ .Values.prometheus.prometheusSpec.image.sha }}" - {{- else if .Values.prometheus.prometheusSpec.image.tag }} - image: "{{ $registry }}/{{ .Values.prometheus.prometheusSpec.image.repository }}:{{ .Values.prometheus.prometheusSpec.image.tag }}" - {{- else }} - image: "{{ $registry }}/{{ .Values.prometheus.prometheusSpec.image.repository }}" - {{- end }} - version: {{ default .Values.prometheus.prometheusSpec.image.tag .Values.prometheus.prometheusSpec.version }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.additionalArgs }} - additionalArgs: -{{ toYaml .Values.prometheus.prometheusSpec.additionalArgs | indent 4}} -{{- end -}} -{{- if .Values.prometheus.prometheusSpec.externalLabels }} - externalLabels: -{{ tpl (toYaml .Values.prometheus.prometheusSpec.externalLabels | indent 4) . }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.prometheusExternalLabelNameClear }} - prometheusExternalLabelName: "" -{{- else if .Values.prometheus.prometheusSpec.prometheusExternalLabelName }} - prometheusExternalLabelName: "{{ .Values.prometheus.prometheusSpec.prometheusExternalLabelName }}" -{{- end }} -{{- if .Values.prometheus.prometheusSpec.replicaExternalLabelNameClear }} - replicaExternalLabelName: "" -{{- else if .Values.prometheus.prometheusSpec.replicaExternalLabelName }} - replicaExternalLabelName: "{{ .Values.prometheus.prometheusSpec.replicaExternalLabelName }}" -{{- end }} -{{- if .Values.prometheus.prometheusSpec.enableRemoteWriteReceiver }} - enableRemoteWriteReceiver: {{ .Values.prometheus.prometheusSpec.enableRemoteWriteReceiver }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.externalUrl }} - externalUrl: "{{ tpl .Values.prometheus.prometheusSpec.externalUrl . }}" -{{- else if and .Values.prometheus.ingress.enabled .Values.prometheus.ingress.hosts }} - externalUrl: "http://{{ tpl (index .Values.prometheus.ingress.hosts 0) . }}{{ .Values.prometheus.prometheusSpec.routePrefix }}" -{{- else if not (or (kindIs "invalid" .Values.global.cattle.url) (kindIs "invalid" .Values.global.cattle.clusterId)) }} - externalUrl: "{{ .Values.global.cattle.url }}/k8s/clusters/{{ .Values.global.cattle.clusterId }}/api/v1/namespaces/{{ template "kube-prometheus-stack.namespace" . }}/services/http:{{ template "kube-prometheus-stack.fullname" . }}-prometheus:{{ .Values.prometheus.service.port }}/proxy" -{{- else }} - externalUrl: http://{{ template "kube-prometheus-stack.fullname" . }}-prometheus.{{ template "kube-prometheus-stack.namespace" . }}:{{ .Values.prometheus.service.port }} -{{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 4 }} -{{- if .Values.prometheus.prometheusSpec.nodeSelector }} -{{ toYaml .Values.prometheus.prometheusSpec.nodeSelector | indent 4 }} -{{- end }} - paused: {{ .Values.prometheus.prometheusSpec.paused }} - replicas: {{ .Values.prometheus.prometheusSpec.replicas }} - shards: {{ .Values.prometheus.prometheusSpec.shards }} - logLevel: {{ .Values.prometheus.prometheusSpec.logLevel }} - logFormat: {{ .Values.prometheus.prometheusSpec.logFormat }} - listenLocal: {{ .Values.prometheus.prometheusSpec.listenLocal }} - enableAdminAPI: {{ .Values.prometheus.prometheusSpec.enableAdminAPI }} -{{- if .Values.prometheus.prometheusSpec.web }} - web: -{{ toYaml .Values.prometheus.prometheusSpec.web | indent 4 }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.exemplars }} - exemplars: - {{ toYaml .Values.prometheus.prometheusSpec.exemplars | indent 4 }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.enableFeatures }} - enableFeatures: -{{- range $enableFeatures := .Values.prometheus.prometheusSpec.enableFeatures }} - - {{ tpl $enableFeatures $ }} -{{- end }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.scrapeInterval }} - scrapeInterval: {{ .Values.prometheus.prometheusSpec.scrapeInterval }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.scrapeTimeout }} - scrapeTimeout: {{ .Values.prometheus.prometheusSpec.scrapeTimeout }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.evaluationInterval }} - evaluationInterval: {{ .Values.prometheus.prometheusSpec.evaluationInterval }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.resources }} - resources: -{{ toYaml .Values.prometheus.prometheusSpec.resources | indent 4 }} -{{- end }} - retention: {{ .Values.prometheus.prometheusSpec.retention | quote }} -{{- if .Values.prometheus.prometheusSpec.retentionSize }} - retentionSize: {{ .Values.prometheus.prometheusSpec.retentionSize | quote }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.tsdb }} - tsdb: - {{- if .Values.prometheus.prometheusSpec.tsdb.outOfOrderTimeWindow }} - outOfOrderTimeWindow: {{ .Values.prometheus.prometheusSpec.tsdb.outOfOrderTimeWindow }} - {{- end }} -{{- end }} -{{- if eq .Values.prometheus.prometheusSpec.walCompression false }} - walCompression: false -{{ else }} - walCompression: true -{{- end }} -{{- if .Values.prometheus.prometheusSpec.routePrefix }} - routePrefix: {{ .Values.prometheus.prometheusSpec.routePrefix | quote }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.secrets }} - secrets: -{{ toYaml .Values.prometheus.prometheusSpec.secrets | indent 4 }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.configMaps }} - configMaps: -{{ toYaml .Values.prometheus.prometheusSpec.configMaps | indent 4 }} -{{- end }} - serviceAccountName: {{ template "kube-prometheus-stack.prometheus.serviceAccountName" . }} -{{- if .Values.prometheus.prometheusSpec.serviceMonitorSelector }} - serviceMonitorSelector: -{{ toYaml .Values.prometheus.prometheusSpec.serviceMonitorSelector | indent 4 }} -{{ else if .Values.prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues }} - serviceMonitorSelector: - matchLabels: - release: {{ $.Release.Name | quote }} -{{ else }} - serviceMonitorSelector: {} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.serviceMonitorNamespaceSelector }} - serviceMonitorNamespaceSelector: -{{ toYaml .Values.prometheus.prometheusSpec.serviceMonitorNamespaceSelector | indent 4 }} -{{ else }} - serviceMonitorNamespaceSelector: {} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.podMonitorSelector }} - podMonitorSelector: -{{ toYaml .Values.prometheus.prometheusSpec.podMonitorSelector | indent 4 }} -{{ else if .Values.prometheus.prometheusSpec.podMonitorSelectorNilUsesHelmValues }} - podMonitorSelector: - matchLabels: - release: {{ $.Release.Name | quote }} -{{ else }} - podMonitorSelector: {} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.podMonitorNamespaceSelector }} - podMonitorNamespaceSelector: -{{ toYaml .Values.prometheus.prometheusSpec.podMonitorNamespaceSelector | indent 4 }} -{{ else }} - podMonitorNamespaceSelector: {} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.probeSelector }} - probeSelector: -{{ toYaml .Values.prometheus.prometheusSpec.probeSelector | indent 4 }} -{{ else if .Values.prometheus.prometheusSpec.probeSelectorNilUsesHelmValues }} - probeSelector: - matchLabels: - release: {{ $.Release.Name | quote }} -{{ else }} - probeSelector: {} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.probeNamespaceSelector }} - probeNamespaceSelector: -{{ toYaml .Values.prometheus.prometheusSpec.probeNamespaceSelector | indent 4 }} -{{ else }} - probeNamespaceSelector: {} -{{- end }} -{{- if (or .Values.prometheus.prometheusSpec.remoteRead .Values.prometheus.prometheusSpec.additionalRemoteRead) }} - remoteRead: -{{- if .Values.prometheus.prometheusSpec.remoteRead }} -{{ tpl (toYaml .Values.prometheus.prometheusSpec.remoteRead | indent 4) . }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.additionalRemoteRead }} -{{ toYaml .Values.prometheus.prometheusSpec.additionalRemoteRead | indent 4 }} -{{- end }} -{{- end }} -{{- if (or .Values.prometheus.prometheusSpec.remoteWrite .Values.prometheus.prometheusSpec.additionalRemoteWrite) }} - remoteWrite: -{{- if .Values.prometheus.prometheusSpec.remoteWrite }} -{{ tpl (toYaml .Values.prometheus.prometheusSpec.remoteWrite | indent 4) . }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.additionalRemoteWrite }} -{{ toYaml .Values.prometheus.prometheusSpec.additionalRemoteWrite | indent 4 }} -{{- end }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.securityContext }} - securityContext: -{{ toYaml .Values.prometheus.prometheusSpec.securityContext | indent 4 }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.ruleNamespaceSelector }} - ruleNamespaceSelector: -{{ toYaml .Values.prometheus.prometheusSpec.ruleNamespaceSelector | indent 4 }} -{{ else }} - ruleNamespaceSelector: {} -{{- end }} -{{- if not (has "agent" .Values.prometheus.prometheusSpec.enableFeatures) }} -{{- if .Values.prometheus.prometheusSpec.ruleSelector }} - ruleSelector: -{{ toYaml .Values.prometheus.prometheusSpec.ruleSelector | indent 4}} -{{- else if .Values.prometheus.prometheusSpec.ruleSelectorNilUsesHelmValues }} - ruleSelector: - matchLabels: - release: {{ $.Release.Name | quote }} -{{ else }} - ruleSelector: {} -{{- end }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.storageSpec }} - storage: -{{ tpl (toYaml .Values.prometheus.prometheusSpec.storageSpec | indent 4) . }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.podMetadata }} - podMetadata: -{{ tpl (toYaml .Values.prometheus.prometheusSpec.podMetadata | indent 4) . }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.query }} - query: -{{ toYaml .Values.prometheus.prometheusSpec.query | indent 4}} -{{- end }} -{{- if or .Values.prometheus.prometheusSpec.podAntiAffinity .Values.prometheus.prometheusSpec.affinity }} - affinity: -{{- if .Values.prometheus.prometheusSpec.affinity }} -{{ toYaml .Values.prometheus.prometheusSpec.affinity | indent 4 }} -{{- end }} -{{- if eq .Values.prometheus.prometheusSpec.podAntiAffinity "hard" }} - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - topologyKey: {{ .Values.prometheus.prometheusSpec.podAntiAffinityTopologyKey }} - labelSelector: - matchExpressions: - - {key: app.kubernetes.io/name, operator: In, values: [prometheus]} - - {key: prometheus, operator: In, values: [{{ template "kube-prometheus-stack.prometheus.crname" . }}]} -{{- else if eq .Values.prometheus.prometheusSpec.podAntiAffinity "soft" }} - podAntiAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - weight: 100 - podAffinityTerm: - topologyKey: {{ .Values.prometheus.prometheusSpec.podAntiAffinityTopologyKey }} - labelSelector: - matchExpressions: - - {key: app.kubernetes.io/name, operator: In, values: [prometheus]} - - {key: prometheus, operator: In, values: [{{ template "kube-prometheus-stack.prometheus.crname" . }}]} -{{- end }} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 4 }} -{{- if .Values.prometheus.prometheusSpec.tolerations }} -{{ toYaml .Values.prometheus.prometheusSpec.tolerations | indent 4 }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.topologySpreadConstraints }} - topologySpreadConstraints: -{{ toYaml .Values.prometheus.prometheusSpec.topologySpreadConstraints | indent 4 }} -{{- end }} -{{- if .Values.global.imagePullSecrets }} - imagePullSecrets: -{{ include "kube-prometheus-stack.imagePullSecrets" . | trim | indent 4 }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.additionalScrapeConfigs }} - additionalScrapeConfigs: - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus-scrape-confg - key: additional-scrape-configs.yaml -{{- end }} -{{- if .Values.prometheus.prometheusSpec.additionalScrapeConfigsSecret.enabled }} - additionalScrapeConfigs: - name: {{ .Values.prometheus.prometheusSpec.additionalScrapeConfigsSecret.name }} - key: {{ .Values.prometheus.prometheusSpec.additionalScrapeConfigsSecret.key }} -{{- end }} -{{- if or .Values.prometheus.prometheusSpec.additionalAlertManagerConfigs .Values.prometheus.prometheusSpec.additionalAlertManagerConfigsSecret }} - additionalAlertManagerConfigs: -{{- if .Values.prometheus.prometheusSpec.additionalAlertManagerConfigs }} - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus-am-confg - key: additional-alertmanager-configs.yaml -{{- end }} -{{- if .Values.prometheus.prometheusSpec.additionalAlertManagerConfigsSecret }} - name: {{ .Values.prometheus.prometheusSpec.additionalAlertManagerConfigsSecret.name }} - key: {{ .Values.prometheus.prometheusSpec.additionalAlertManagerConfigsSecret.key }} - {{- if hasKey .Values.prometheus.prometheusSpec.additionalAlertManagerConfigsSecret "optional" }} - optional: {{ .Values.prometheus.prometheusSpec.additionalAlertManagerConfigsSecret.optional }} - {{- end }} -{{- end }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.additionalAlertRelabelConfigs }} - additionalAlertRelabelConfigs: - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus-am-relabel-confg - key: additional-alert-relabel-configs.yaml -{{- end }} -{{- if .Values.prometheus.prometheusSpec.additionalAlertRelabelConfigsSecret }} - additionalAlertRelabelConfigs: - name: {{ .Values.prometheus.prometheusSpec.additionalAlertRelabelConfigsSecret.name }} - key: {{ .Values.prometheus.prometheusSpec.additionalAlertRelabelConfigsSecret.key }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.containers }} - containers: -{{ tpl .Values.prometheus.prometheusSpec.containers $ | indent 4 }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.initContainers }} - initContainers: -{{ toYaml .Values.prometheus.prometheusSpec.initContainers | indent 4 }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.priorityClassName }} - priorityClassName: {{ .Values.prometheus.prometheusSpec.priorityClassName }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.thanos }} - thanos: -{{ toYaml .Values.prometheus.prometheusSpec.thanos | indent 4 }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.disableCompaction }} - disableCompaction: {{ .Values.prometheus.prometheusSpec.disableCompaction }} -{{- end }} - portName: {{ .Values.prometheus.prometheusSpec.portName }} -{{- if .Values.prometheus.prometheusSpec.volumes }} - volumes: -{{ toYaml .Values.prometheus.prometheusSpec.volumes | indent 4 }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.volumeMounts }} - volumeMounts: -{{ toYaml .Values.prometheus.prometheusSpec.volumeMounts | indent 4 }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.arbitraryFSAccessThroughSMs }} - arbitraryFSAccessThroughSMs: -{{ toYaml .Values.prometheus.prometheusSpec.arbitraryFSAccessThroughSMs | indent 4 }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.overrideHonorLabels }} - overrideHonorLabels: {{ .Values.prometheus.prometheusSpec.overrideHonorLabels }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.overrideHonorTimestamps }} - overrideHonorTimestamps: {{ .Values.prometheus.prometheusSpec.overrideHonorTimestamps }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.ignoreNamespaceSelectors }} - ignoreNamespaceSelectors: {{ .Values.prometheus.prometheusSpec.ignoreNamespaceSelectors }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.enforcedNamespaceLabel }} - enforcedNamespaceLabel: {{ .Values.prometheus.prometheusSpec.enforcedNamespaceLabel }} -{{- $prometheusDefaultRulesExcludedFromEnforce := (include "rules.names" .) | fromYaml }} - prometheusRulesExcludedFromEnforce: -{{- range $prometheusDefaultRulesExcludedFromEnforce.rules }} - - ruleNamespace: "{{ template "kube-prometheus-stack.namespace" $ }}" - ruleName: "{{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) . | trunc 63 | trimSuffix "-" }}" -{{- end }} -{{- if .Values.prometheus.prometheusSpec.prometheusRulesExcludedFromEnforce }} -{{ toYaml .Values.prometheus.prometheusSpec.prometheusRulesExcludedFromEnforce | indent 4 }} -{{- end }} - excludedFromEnforcement: -{{- range $prometheusDefaultRulesExcludedFromEnforce.rules }} - - group: monitoring.coreos.com - resource: prometheusrules - namespace: "{{ template "kube-prometheus-stack.namespace" $ }}" - name: "{{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) . | trunc 63 | trimSuffix "-" }}" -{{- end }} -{{- if .Values.prometheus.prometheusSpec.excludedFromEnforcement }} -{{ tpl (toYaml .Values.prometheus.prometheusSpec.excludedFromEnforcement | indent 4) . }} -{{- end }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.queryLogFile }} - queryLogFile: {{ .Values.prometheus.prometheusSpec.queryLogFile }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.enforcedSampleLimit }} - enforcedSampleLimit: {{ .Values.prometheus.prometheusSpec.enforcedSampleLimit }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.enforcedTargetLimit }} - enforcedTargetLimit: {{ .Values.prometheus.prometheusSpec.enforcedTargetLimit }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.enforcedLabelLimit }} - enforcedLabelLimit: {{ .Values.prometheus.prometheusSpec.enforcedLabelLimit }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.enforcedLabelNameLengthLimit }} - enforcedLabelNameLengthLimit: {{ .Values.prometheus.prometheusSpec.enforcedLabelNameLengthLimit }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.enforcedLabelValueLengthLimit}} - enforcedLabelValueLengthLimit: {{ .Values.prometheus.prometheusSpec.enforcedLabelValueLengthLimit }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.allowOverlappingBlocks }} - allowOverlappingBlocks: {{ .Values.prometheus.prometheusSpec.allowOverlappingBlocks }} -{{- end }} -{{- if .Values.prometheus.prometheusSpec.minReadySeconds }} - minReadySeconds: {{ .Values.prometheus.prometheusSpec.minReadySeconds }} -{{- end }} - hostNetwork: {{ .Values.prometheus.prometheusSpec.hostNetwork }} -{{- if .Values.prometheus.prometheusSpec.hostAliases }} - hostAliases: -{{ toYaml .Values.prometheus.prometheusSpec.hostAliases | indent 4 }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/psp-clusterrole.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/psp-clusterrole.yaml deleted file mode 100644 index 71476cd18b..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/psp-clusterrole.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- if and .Values.prometheus.enabled (or .Values.global.cattle.psp.enabled (and .Values.global.rbac.create .Values.global.rbac.pspEnabled)) }} -{{- if .Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy" }} -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus-psp - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -rules: -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if semverCompare "> 1.15.0-0" $kubeTargetVersion }} -- apiGroups: ['policy'] -{{- else }} -- apiGroups: ['extensions'] -{{- end }} - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "kube-prometheus-stack.fullname" . }}-prometheus -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/psp-clusterrolebinding.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/psp-clusterrolebinding.yaml deleted file mode 100644 index a393928c78..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/psp-clusterrolebinding.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if and .Values.prometheus.enabled (or .Values.global.cattle.psp.enabled (and .Values.global.rbac.create .Values.global.rbac.pspEnabled)) }} -{{- if .Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy" }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus-psp - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus-psp -subjects: - - kind: ServiceAccount - name: {{ template "kube-prometheus-stack.prometheus.serviceAccountName" . }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/psp.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/psp.yaml deleted file mode 100644 index 62d3854151..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/psp.yaml +++ /dev/null @@ -1,58 +0,0 @@ -{{- if and .Values.prometheus.enabled (or .Values.global.cattle.psp.enabled (and .Values.global.rbac.create .Values.global.rbac.pspEnabled)) }} -{{- if .Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy" }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus -{{- if .Values.global.rbac.pspAnnotations }} - annotations: -{{ toYaml .Values.global.rbac.pspAnnotations | indent 4 }} -{{- end }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - privileged: false - # Allow core volume types. - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'secret' - - 'downwardAPI' - - 'persistentVolumeClaim' -{{- if .Values.prometheus.podSecurityPolicy.volumes }} -{{ toYaml .Values.prometheus.podSecurityPolicy.volumes | indent 4 }} -{{- end }} - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - # Permits the container to run with root privileges as well. - rule: 'RunAsAny' - seLinux: - # This policy assumes the nodes are using AppArmor rather than SELinux. - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - # Allow adding the root group. - - min: 0 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - # Allow adding the root group. - - min: 0 - max: 65535 - readOnlyRootFilesystem: false -{{- if .Values.prometheus.podSecurityPolicy.allowedCapabilities }} - allowedCapabilities: -{{ toYaml .Values.prometheus.podSecurityPolicy.allowedCapabilities | indent 4 }} -{{- end }} -{{- if .Values.prometheus.podSecurityPolicy.allowedHostPaths }} - allowedHostPaths: -{{ toYaml .Values.prometheus.podSecurityPolicy.allowedHostPaths | indent 4 }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/alertmanager.rules.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/alertmanager.rules.yaml deleted file mode 100644 index c894744328..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/alertmanager.rules.yaml +++ /dev/null @@ -1,217 +0,0 @@ -{{- /* -Generated from 'alertmanager.rules' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/alertmanager-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.alertmanager }} -{{- $alertmanagerJob := printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "alertmanager" }} -{{- $namespace := printf "%s" (include "kube-prometheus-stack.namespace" .) }} -{{- if and .Values.alertmanager.enabled .Values.alertmanager.serviceMonitor.selfMonitor }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "alertmanager.rules" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: alertmanager.rules - rules: -{{- if not (.Values.defaultRules.disabled.AlertmanagerFailedReload | default false) }} - - alert: AlertmanagerFailedReload - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Configuration has failed to load for {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.pod{{`}}`}}. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/alertmanager/alertmanagerfailedreload - summary: Reloading an Alertmanager configuration has failed. - expr: |- - # Without max_over_time, failed scrapes could create false negatives, see - # https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details. - max_over_time(alertmanager_config_last_reload_successful{job="{{ $alertmanagerJob }}",namespace="{{ $namespace }}"}[5m]) == 0 - for: 10m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.AlertmanagerMembersInconsistent | default false) }} - - alert: AlertmanagerMembersInconsistent - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Alertmanager {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.pod{{`}}`}} has only found {{`{{`}} $value {{`}}`}} members of the {{`{{`}}$labels.job{{`}}`}} cluster. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/alertmanager/alertmanagermembersinconsistent - summary: A member of an Alertmanager cluster has not found all other cluster members. - expr: |- - # Without max_over_time, failed scrapes could create false negatives, see - # https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details. - max_over_time(alertmanager_cluster_members{job="{{ $alertmanagerJob }}",namespace="{{ $namespace }}"}[5m]) - < on (namespace,service) group_left - count by (namespace,service) (max_over_time(alertmanager_cluster_members{job="{{ $alertmanagerJob }}",namespace="{{ $namespace }}"}[5m])) - for: 15m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.AlertmanagerFailedToSendAlerts | default false) }} - - alert: AlertmanagerFailedToSendAlerts - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Alertmanager {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.pod{{`}}`}} failed to send {{`{{`}} $value | humanizePercentage {{`}}`}} of notifications to {{`{{`}} $labels.integration {{`}}`}}. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/alertmanager/alertmanagerfailedtosendalerts - summary: An Alertmanager instance failed to send notifications. - expr: |- - ( - rate(alertmanager_notifications_failed_total{job="{{ $alertmanagerJob }}",namespace="{{ $namespace }}"}[5m]) - / - rate(alertmanager_notifications_total{job="{{ $alertmanagerJob }}",namespace="{{ $namespace }}"}[5m]) - ) - > 0.01 - for: 5m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.AlertmanagerClusterFailedToSendAlerts | default false) }} - - alert: AlertmanagerClusterFailedToSendAlerts - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: The minimum notification failure rate to {{`{{`}} $labels.integration {{`}}`}} sent from any instance in the {{`{{`}}$labels.job{{`}}`}} cluster is {{`{{`}} $value | humanizePercentage {{`}}`}}. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/alertmanager/alertmanagerclusterfailedtosendalerts - summary: All Alertmanager instances in a cluster failed to send notifications to a critical integration. - expr: |- - min by (namespace,service, integration) ( - rate(alertmanager_notifications_failed_total{job="{{ $alertmanagerJob }}",namespace="{{ $namespace }}", integration=~`.*`}[5m]) - / - rate(alertmanager_notifications_total{job="{{ $alertmanagerJob }}",namespace="{{ $namespace }}", integration=~`.*`}[5m]) - ) - > 0.01 - for: 5m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.AlertmanagerClusterFailedToSendAlerts | default false) }} - - alert: AlertmanagerClusterFailedToSendAlerts - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: The minimum notification failure rate to {{`{{`}} $labels.integration {{`}}`}} sent from any instance in the {{`{{`}}$labels.job{{`}}`}} cluster is {{`{{`}} $value | humanizePercentage {{`}}`}}. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/alertmanager/alertmanagerclusterfailedtosendalerts - summary: All Alertmanager instances in a cluster failed to send notifications to a non-critical integration. - expr: |- - min by (namespace,service, integration) ( - rate(alertmanager_notifications_failed_total{job="{{ $alertmanagerJob }}",namespace="{{ $namespace }}", integration!~`.*`}[5m]) - / - rate(alertmanager_notifications_total{job="{{ $alertmanagerJob }}",namespace="{{ $namespace }}", integration!~`.*`}[5m]) - ) - > 0.01 - for: 5m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.AlertmanagerConfigInconsistent | default false) }} - - alert: AlertmanagerConfigInconsistent - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Alertmanager instances within the {{`{{`}}$labels.job{{`}}`}} cluster have different configurations. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/alertmanager/alertmanagerconfiginconsistent - summary: Alertmanager instances within the same cluster have different configurations. - expr: |- - count by (namespace,service) ( - count_values by (namespace,service) ("config_hash", alertmanager_config_hash{job="{{ $alertmanagerJob }}",namespace="{{ $namespace }}"}) - ) - != 1 - for: 20m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.AlertmanagerClusterDown | default false) }} - - alert: AlertmanagerClusterDown - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: '{{`{{`}} $value | humanizePercentage {{`}}`}} of Alertmanager instances within the {{`{{`}}$labels.job{{`}}`}} cluster have been up for less than half of the last 5m.' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/alertmanager/alertmanagerclusterdown - summary: Half or more of the Alertmanager instances within the same cluster are down. - expr: |- - ( - count by (namespace,service) ( - avg_over_time(up{job="{{ $alertmanagerJob }}",namespace="{{ $namespace }}"}[5m]) < 0.5 - ) - / - count by (namespace,service) ( - up{job="{{ $alertmanagerJob }}",namespace="{{ $namespace }}"} - ) - ) - >= 0.5 - for: 5m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.AlertmanagerClusterCrashlooping | default false) }} - - alert: AlertmanagerClusterCrashlooping - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: '{{`{{`}} $value | humanizePercentage {{`}}`}} of Alertmanager instances within the {{`{{`}}$labels.job{{`}}`}} cluster have restarted at least 5 times in the last 10m.' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/alertmanager/alertmanagerclustercrashlooping - summary: Half or more of the Alertmanager instances within the same cluster are crashlooping. - expr: |- - ( - count by (namespace,service) ( - changes(process_start_time_seconds{job="{{ $alertmanagerJob }}",namespace="{{ $namespace }}"}[10m]) > 4 - ) - / - count by (namespace,service) ( - up{job="{{ $alertmanagerJob }}",namespace="{{ $namespace }}"} - ) - ) - >= 0.5 - for: 5m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/config-reloaders.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/config-reloaders.yaml deleted file mode 100644 index f0b36cff9e..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/config-reloaders.yaml +++ /dev/null @@ -1,46 +0,0 @@ -{{- /* -Generated from 'config-reloaders' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/prometheusOperator-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.configReloaders }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "config-reloaders" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: config-reloaders - rules: -{{- if not (.Values.defaultRules.disabled.ConfigReloaderSidecarErrors | default false) }} - - alert: ConfigReloaderSidecarErrors - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'Errors encountered while the {{`{{`}}$labels.pod{{`}}`}} config-reloader sidecar attempts to sync config in {{`{{`}}$labels.namespace{{`}}`}} namespace. - - As a result, configuration for service running in {{`{{`}}$labels.pod{{`}}`}} may be stale and cannot be updated anymore.' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus-operator/configreloadersidecarerrors - summary: config-reloader sidecar has not had a successful reload for 10m - expr: max_over_time(reloader_last_reload_successful{namespace=~".+"}[5m]) == 0 - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/etcd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/etcd.yaml deleted file mode 100644 index d30f505203..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/etcd.yaml +++ /dev/null @@ -1,296 +0,0 @@ -{{- /* -Generated from 'etcd' group from https://raw.githubusercontent.com/etcd-io/etcd/main/contrib/mixin/mixin.libsonnet -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.etcd }} -{{- if (include "exporter.kubeEtcd.enabled" .)}} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "etcd" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: etcd - rules: -{{- if not (.Values.defaultRules.disabled.etcdMembersDown | default false) }} - - alert: etcdMembersDown - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'etcd cluster "{{`{{`}} $labels.job {{`}}`}}": members are down ({{`{{`}} $value {{`}}`}}).' - summary: etcd cluster members are down. - expr: |- - max without (endpoint) ( - sum without (instance) (up{job=~".*etcd.*"} == bool 0) - or - count without (To) ( - sum without (instance) (rate(etcd_network_peer_sent_failures_total{job=~".*etcd.*"}[120s])) > 0.01 - ) - ) - > 0 - for: 10m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.etcdInsufficientMembers | default false) }} - - alert: etcdInsufficientMembers - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'etcd cluster "{{`{{`}} $labels.job {{`}}`}}": insufficient members ({{`{{`}} $value {{`}}`}}).' - summary: etcd cluster has insufficient number of members. - expr: sum(up{job=~".*etcd.*"} == bool 1) without (instance) < ((count(up{job=~".*etcd.*"}) without (instance) + 1) / 2) - for: 3m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.etcdNoLeader | default false) }} - - alert: etcdNoLeader - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'etcd cluster "{{`{{`}} $labels.job {{`}}`}}": member {{`{{`}} $labels.instance {{`}}`}} has no leader.' - summary: etcd cluster has no leader. - expr: etcd_server_has_leader{job=~".*etcd.*"} == 0 - for: 1m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.etcdHighNumberOfLeaderChanges | default false) }} - - alert: etcdHighNumberOfLeaderChanges - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'etcd cluster "{{`{{`}} $labels.job {{`}}`}}": {{`{{`}} $value {{`}}`}} leader changes within the last 15 minutes. Frequent elections may be a sign of insufficient resources, high network latency, or disruptions by other components and should be investigated.' - summary: etcd cluster has high number of leader changes. - expr: increase((max without (instance) (etcd_server_leader_changes_seen_total{job=~".*etcd.*"}) or 0*absent(etcd_server_leader_changes_seen_total{job=~".*etcd.*"}))[15m:1m]) >= 4 - for: 5m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.etcdHighNumberOfFailedGRPCRequests | default false) }} - - alert: etcdHighNumberOfFailedGRPCRequests - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'etcd cluster "{{`{{`}} $labels.job {{`}}`}}": {{`{{`}} $value {{`}}`}}% of requests for {{`{{`}} $labels.grpc_method {{`}}`}} failed on etcd instance {{`{{`}} $labels.instance {{`}}`}}.' - summary: etcd cluster has high number of failed grpc requests. - expr: |- - 100 * sum(rate(grpc_server_handled_total{job=~".*etcd.*", grpc_code=~"Unknown|FailedPrecondition|ResourceExhausted|Internal|Unavailable|DataLoss|DeadlineExceeded"}[5m])) without (grpc_type, grpc_code) - / - sum(rate(grpc_server_handled_total{job=~".*etcd.*"}[5m])) without (grpc_type, grpc_code) - > 1 - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.etcdHighNumberOfFailedGRPCRequests | default false) }} - - alert: etcdHighNumberOfFailedGRPCRequests - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'etcd cluster "{{`{{`}} $labels.job {{`}}`}}": {{`{{`}} $value {{`}}`}}% of requests for {{`{{`}} $labels.grpc_method {{`}}`}} failed on etcd instance {{`{{`}} $labels.instance {{`}}`}}.' - summary: etcd cluster has high number of failed grpc requests. - expr: |- - 100 * sum(rate(grpc_server_handled_total{job=~".*etcd.*", grpc_code=~"Unknown|FailedPrecondition|ResourceExhausted|Internal|Unavailable|DataLoss|DeadlineExceeded"}[5m])) without (grpc_type, grpc_code) - / - sum(rate(grpc_server_handled_total{job=~".*etcd.*"}[5m])) without (grpc_type, grpc_code) - > 5 - for: 5m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.etcdGRPCRequestsSlow | default false) }} - - alert: etcdGRPCRequestsSlow - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'etcd cluster "{{`{{`}} $labels.job {{`}}`}}": 99th percentile of gRPC requests is {{`{{`}} $value {{`}}`}}s on etcd instance {{`{{`}} $labels.instance {{`}}`}} for {{`{{`}} $labels.grpc_method {{`}}`}} method.' - summary: etcd grpc requests are slow - expr: |- - histogram_quantile(0.99, sum(rate(grpc_server_handling_seconds_bucket{job=~".*etcd.*", grpc_method!="Defragment", grpc_type="unary"}[5m])) without(grpc_type)) - > 0.15 - for: 10m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.etcdMemberCommunicationSlow | default false) }} - - alert: etcdMemberCommunicationSlow - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'etcd cluster "{{`{{`}} $labels.job {{`}}`}}": member communication with {{`{{`}} $labels.To {{`}}`}} is taking {{`{{`}} $value {{`}}`}}s on etcd instance {{`{{`}} $labels.instance {{`}}`}}.' - summary: etcd cluster member communication is slow. - expr: |- - histogram_quantile(0.99, rate(etcd_network_peer_round_trip_time_seconds_bucket{job=~".*etcd.*"}[5m])) - > 0.15 - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.etcdHighNumberOfFailedProposals | default false) }} - - alert: etcdHighNumberOfFailedProposals - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'etcd cluster "{{`{{`}} $labels.job {{`}}`}}": {{`{{`}} $value {{`}}`}} proposal failures within the last 30 minutes on etcd instance {{`{{`}} $labels.instance {{`}}`}}.' - summary: etcd cluster has high number of proposal failures. - expr: rate(etcd_server_proposals_failed_total{job=~".*etcd.*"}[15m]) > 5 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.etcdHighFsyncDurations | default false) }} - - alert: etcdHighFsyncDurations - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'etcd cluster "{{`{{`}} $labels.job {{`}}`}}": 99th percentile fsync durations are {{`{{`}} $value {{`}}`}}s on etcd instance {{`{{`}} $labels.instance {{`}}`}}.' - summary: etcd cluster 99th percentile fsync durations are too high. - expr: |- - histogram_quantile(0.99, rate(etcd_disk_wal_fsync_duration_seconds_bucket{job=~".*etcd.*"}[5m])) - > 0.5 - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.etcdHighFsyncDurations | default false) }} - - alert: etcdHighFsyncDurations - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'etcd cluster "{{`{{`}} $labels.job {{`}}`}}": 99th percentile fsync durations are {{`{{`}} $value {{`}}`}}s on etcd instance {{`{{`}} $labels.instance {{`}}`}}.' - summary: etcd cluster 99th percentile fsync durations are too high. - expr: |- - histogram_quantile(0.99, rate(etcd_disk_wal_fsync_duration_seconds_bucket{job=~".*etcd.*"}[5m])) - > 1 - for: 10m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.etcdHighCommitDurations | default false) }} - - alert: etcdHighCommitDurations - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'etcd cluster "{{`{{`}} $labels.job {{`}}`}}": 99th percentile commit durations {{`{{`}} $value {{`}}`}}s on etcd instance {{`{{`}} $labels.instance {{`}}`}}.' - summary: etcd cluster 99th percentile commit durations are too high. - expr: |- - histogram_quantile(0.99, rate(etcd_disk_backend_commit_duration_seconds_bucket{job=~".*etcd.*"}[5m])) - > 0.25 - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.etcdDatabaseQuotaLowSpace | default false) }} - - alert: etcdDatabaseQuotaLowSpace - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'etcd cluster "{{`{{`}} $labels.job {{`}}`}}": database size exceeds the defined quota on etcd instance {{`{{`}} $labels.instance {{`}}`}}, please defrag or increase the quota as the writes to etcd will be disabled when it is full.' - summary: etcd cluster database is running full. - expr: (last_over_time(etcd_mvcc_db_total_size_in_bytes[5m]) / last_over_time(etcd_server_quota_backend_bytes[5m]))*100 > 95 - for: 10m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.etcdExcessiveDatabaseGrowth | default false) }} - - alert: etcdExcessiveDatabaseGrowth - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'etcd cluster "{{`{{`}} $labels.job {{`}}`}}": Predicting running out of disk space in the next four hours, based on write observations within the past four hours on etcd instance {{`{{`}} $labels.instance {{`}}`}}, please check as it might be disruptive.' - summary: etcd cluster database growing very fast. - expr: predict_linear(etcd_mvcc_db_total_size_in_bytes[4h], 4*60*60) > etcd_server_quota_backend_bytes - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.etcdDatabaseHighFragmentationRatio | default false) }} - - alert: etcdDatabaseHighFragmentationRatio - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'etcd cluster "{{`{{`}} $labels.job {{`}}`}}": database size in use on instance {{`{{`}} $labels.instance {{`}}`}} is {{`{{`}} $value | humanizePercentage {{`}}`}} of the actual allocated disk space, please run defragmentation (e.g. etcdctl defrag) to retrieve the unused fragmented disk space.' - runbook_url: https://etcd.io/docs/v3.5/op-guide/maintenance/#defragmentation - summary: etcd database size in use is less than 50% of the actual allocated storage. - expr: (last_over_time(etcd_mvcc_db_total_size_in_use_in_bytes[5m]) / last_over_time(etcd_mvcc_db_total_size_in_bytes[5m])) < 0.5 and etcd_mvcc_db_total_size_in_use_in_bytes > 104857600 - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/general.rules.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/general.rules.yaml deleted file mode 100644 index a9e42cdcf0..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/general.rules.yaml +++ /dev/null @@ -1,98 +0,0 @@ -{{- /* -Generated from 'general.rules' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubePrometheus-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.general }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "general.rules" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: general.rules - rules: -{{- if not (.Values.defaultRules.disabled.TargetDown | default false) }} - - alert: TargetDown - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: '{{`{{`}} printf "%.4g" $value {{`}}`}}% of the {{`{{`}} $labels.job {{`}}`}}/{{`{{`}} $labels.service {{`}}`}} targets in {{`{{`}} $labels.namespace {{`}}`}} namespace are down.' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/general/targetdown - summary: One or more targets are unreachable. - expr: 100 * (count(up == 0) BY (job, namespace, service) / count(up) BY (job, namespace, service)) > 10 - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.Watchdog | default false) }} - - alert: Watchdog - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'This is an alert meant to ensure that the entire alerting pipeline is functional. - - This alert is always firing, therefore it should always be firing in Alertmanager - - and always fire against a receiver. There are integrations with various notification - - mechanisms that send a notification when this alert is not firing. For example the - - "DeadMansSnitch" integration in PagerDuty. - - ' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/general/watchdog - summary: An alert that should always be firing to certify that Alertmanager is working properly. - expr: vector(1) - labels: - severity: none - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.InfoInhibitor | default false) }} - - alert: InfoInhibitor - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'This is an alert that is used to inhibit info alerts. - - By themselves, the info-level alerts are sometimes very noisy, but they are relevant when combined with - - other alerts. - - This alert fires whenever there''s a severity="info" alert, and stops firing when another alert with a - - severity of ''warning'' or ''critical'' starts firing on the same namespace. - - This alert should be routed to a null receiver and configured to inhibit alerts with severity="info". - - ' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/general/infoinhibitor - summary: Info-level alert inhibition. - expr: ALERTS{severity = "info"} == 1 unless on(namespace) ALERTS{alertname != "InfoInhibitor", severity =~ "warning|critical", alertstate="firing"} == 1 - labels: - severity: none - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/k8s.rules.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/k8s.rules.yaml deleted file mode 100644 index c61bd222ab..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/k8s.rules.yaml +++ /dev/null @@ -1,237 +0,0 @@ -{{- /* -Generated from 'k8s.rules' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubernetesControlPlane-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.k8s }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "k8s.rules" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: k8s.rules - rules: - - expr: |- - sum by (cluster, namespace, pod, container) ( - irate(container_cpu_usage_seconds_total{job="{{ include "exporter.kubelet.jobName" . }}", metrics_path="/metrics/cadvisor", image!=""}[5m]) - ) * on (cluster, namespace, pod) group_left(node) topk by (cluster, namespace, pod) ( - 1, max by(cluster, namespace, pod, node) (kube_pod_info{node!=""}) - ) - record: node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - container_memory_working_set_bytes{job="kubelet", metrics_path="/metrics/cadvisor", image!=""} - * on (cluster, namespace, pod) group_left(node) topk by(cluster, namespace, pod) (1, - max by(cluster, namespace, pod, node) (kube_pod_info{node!=""}) - ) - record: node_namespace_pod_container:container_memory_working_set_bytes - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - container_memory_rss{job="kubelet", metrics_path="/metrics/cadvisor", image!=""} - * on (cluster, namespace, pod) group_left(node) topk by(cluster, namespace, pod) (1, - max by(cluster, namespace, pod, node) (kube_pod_info{node!=""}) - ) - record: node_namespace_pod_container:container_memory_rss - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - container_memory_cache{job="kubelet", metrics_path="/metrics/cadvisor", image!=""} - * on (cluster, namespace, pod) group_left(node) topk by(cluster, namespace, pod) (1, - max by(cluster, namespace, pod, node) (kube_pod_info{node!=""}) - ) - record: node_namespace_pod_container:container_memory_cache - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - container_memory_swap{job="kubelet", metrics_path="/metrics/cadvisor", image!=""} - * on (cluster, namespace, pod) group_left(node) topk by(cluster, namespace, pod) (1, - max by(cluster, namespace, pod, node) (kube_pod_info{node!=""}) - ) - record: node_namespace_pod_container:container_memory_swap - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - kube_pod_container_resource_requests{resource="memory",job="kube-state-metrics"} * on (namespace, pod, cluster) - group_left() max by (namespace, pod, cluster) ( - (kube_pod_status_phase{phase=~"Pending|Running"} == 1) - ) - record: cluster:namespace:pod_memory:active:kube_pod_container_resource_requests - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - sum by (namespace, cluster) ( - sum by (namespace, pod, cluster) ( - max by (namespace, pod, container, cluster) ( - kube_pod_container_resource_requests{resource="memory",job="kube-state-metrics"} - ) * on(namespace, pod, cluster) group_left() max by (namespace, pod, cluster) ( - kube_pod_status_phase{phase=~"Pending|Running"} == 1 - ) - ) - ) - record: namespace_memory:kube_pod_container_resource_requests:sum - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - kube_pod_container_resource_requests{resource="cpu",job="kube-state-metrics"} * on (namespace, pod, cluster) - group_left() max by (namespace, pod, cluster) ( - (kube_pod_status_phase{phase=~"Pending|Running"} == 1) - ) - record: cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - sum by (namespace, cluster) ( - sum by (namespace, pod, cluster) ( - max by (namespace, pod, container, cluster) ( - kube_pod_container_resource_requests{resource="cpu",job="kube-state-metrics"} - ) * on(namespace, pod, cluster) group_left() max by (namespace, pod, cluster) ( - kube_pod_status_phase{phase=~"Pending|Running"} == 1 - ) - ) - ) - record: namespace_cpu:kube_pod_container_resource_requests:sum - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - kube_pod_container_resource_limits{resource="memory",job="kube-state-metrics"} * on (namespace, pod, cluster) - group_left() max by (namespace, pod, cluster) ( - (kube_pod_status_phase{phase=~"Pending|Running"} == 1) - ) - record: cluster:namespace:pod_memory:active:kube_pod_container_resource_limits - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - sum by (namespace, cluster) ( - sum by (namespace, pod, cluster) ( - max by (namespace, pod, container, cluster) ( - kube_pod_container_resource_limits{resource="memory",job="kube-state-metrics"} - ) * on(namespace, pod, cluster) group_left() max by (namespace, pod, cluster) ( - kube_pod_status_phase{phase=~"Pending|Running"} == 1 - ) - ) - ) - record: namespace_memory:kube_pod_container_resource_limits:sum - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - kube_pod_container_resource_limits{resource="cpu",job="kube-state-metrics"} * on (namespace, pod, cluster) - group_left() max by (namespace, pod, cluster) ( - (kube_pod_status_phase{phase=~"Pending|Running"} == 1) - ) - record: cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - sum by (namespace, cluster) ( - sum by (namespace, pod, cluster) ( - max by (namespace, pod, container, cluster) ( - kube_pod_container_resource_limits{resource="cpu",job="kube-state-metrics"} - ) * on(namespace, pod, cluster) group_left() max by (namespace, pod, cluster) ( - kube_pod_status_phase{phase=~"Pending|Running"} == 1 - ) - ) - ) - record: namespace_cpu:kube_pod_container_resource_limits:sum - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - max by (cluster, namespace, workload, pod) ( - label_replace( - label_replace( - kube_pod_owner{job="kube-state-metrics", owner_kind="ReplicaSet"}, - "replicaset", "$1", "owner_name", "(.*)" - ) * on(replicaset, namespace) group_left(owner_name) topk by(replicaset, namespace) ( - 1, max by (replicaset, namespace, owner_name) ( - kube_replicaset_owner{job="kube-state-metrics"} - ) - ), - "workload", "$1", "owner_name", "(.*)" - ) - ) - labels: - workload_type: deployment - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: namespace_workload_pod:kube_pod_owner:relabel - - expr: |- - max by (cluster, namespace, workload, pod) ( - label_replace( - kube_pod_owner{job="kube-state-metrics", owner_kind="DaemonSet"}, - "workload", "$1", "owner_name", "(.*)" - ) - ) - labels: - workload_type: daemonset - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: namespace_workload_pod:kube_pod_owner:relabel - - expr: |- - max by (cluster, namespace, workload, pod) ( - label_replace( - kube_pod_owner{job="kube-state-metrics", owner_kind="StatefulSet"}, - "workload", "$1", "owner_name", "(.*)" - ) - ) - labels: - workload_type: statefulset - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: namespace_workload_pod:kube_pod_owner:relabel - - expr: |- - max by (cluster, namespace, workload, pod) ( - label_replace( - kube_pod_owner{job="kube-state-metrics", owner_kind="Job"}, - "workload", "$1", "owner_name", "(.*)" - ) - ) - labels: - workload_type: job - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: namespace_workload_pod:kube_pod_owner:relabel -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-apiserver-availability.rules.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-apiserver-availability.rules.yaml deleted file mode 100644 index 6f9d20e9ec..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-apiserver-availability.rules.yaml +++ /dev/null @@ -1,193 +0,0 @@ -{{- /* -Generated from 'kube-apiserver-availability.rules' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubernetesControlPlane-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.kubeApiServer.enabled .Values.defaultRules.rules.kubeApiserverAvailability }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "kube-apiserver-availability.rules" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - interval: 3m - name: kube-apiserver-availability.rules - rules: - - expr: avg_over_time(code_verb:apiserver_request_total:increase1h[30d]) * 24 * 30 - record: code_verb:apiserver_request_total:increase30d - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: sum by (cluster, code) (code_verb:apiserver_request_total:increase30d{verb=~"LIST|GET"}) - labels: - verb: read - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: code:apiserver_request_total:increase30d - - expr: sum by (cluster, code) (code_verb:apiserver_request_total:increase30d{verb=~"POST|PUT|PATCH|DELETE"}) - labels: - verb: write - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: code:apiserver_request_total:increase30d - - expr: sum by (cluster, verb, scope) (increase(apiserver_request_slo_duration_seconds_count[1h])) - record: cluster_verb_scope:apiserver_request_slo_duration_seconds_count:increase1h - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: sum by (cluster, verb, scope) (avg_over_time(cluster_verb_scope:apiserver_request_slo_duration_seconds_count:increase1h[30d]) * 24 * 30) - record: cluster_verb_scope:apiserver_request_slo_duration_seconds_count:increase30d - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: sum by (cluster, verb, scope, le) (increase(apiserver_request_slo_duration_seconds_bucket[1h])) - record: cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase1h - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: sum by (cluster, verb, scope, le) (avg_over_time(cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase1h[30d]) * 24 * 30) - record: cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - 1 - ( - ( - # write too slow - sum by (cluster) (cluster_verb_scope:apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_count:increase30d{verb=~"POST|PUT|PATCH|DELETE"}) - - - sum by (cluster) (cluster_verb_scope_le:apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket:increase30d{verb=~"POST|PUT|PATCH|DELETE",le="1"}) - ) + - ( - # read too slow - sum by (cluster) (cluster_verb_scope:apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_count:increase30d{verb=~"LIST|GET"}) - - - ( - ( - sum by (cluster) (cluster_verb_scope_le:apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket:increase30d{verb=~"LIST|GET",scope=~"resource|",le="1"}) - or - vector(0) - ) - + - sum by (cluster) (cluster_verb_scope_le:apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket:increase30d{verb=~"LIST|GET",scope="namespace",le="5"}) - + - sum by (cluster) (cluster_verb_scope_le:apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket:increase30d{verb=~"LIST|GET",scope="cluster",le="30"}) - ) - ) + - # errors - sum by (cluster) (code:apiserver_request_total:increase30d{code=~"5.."} or vector(0)) - ) - / - sum by (cluster) (code:apiserver_request_total:increase30d) - labels: - verb: all - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: apiserver_request:availability30d - - expr: |- - 1 - ( - sum by (cluster) (cluster_verb_scope:apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_count:increase30d{verb=~"LIST|GET"}) - - - ( - # too slow - ( - sum by (cluster) (cluster_verb_scope_le:apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket:increase30d{verb=~"LIST|GET",scope=~"resource|",le="1"}) - or - vector(0) - ) - + - sum by (cluster) (cluster_verb_scope_le:apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket:increase30d{verb=~"LIST|GET",scope="namespace",le="5"}) - + - sum by (cluster) (cluster_verb_scope_le:apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket:increase30d{verb=~"LIST|GET",scope="cluster",le="30"}) - ) - + - # errors - sum by (cluster) (code:apiserver_request_total:increase30d{verb="read",code=~"5.."} or vector(0)) - ) - / - sum by (cluster) (code:apiserver_request_total:increase30d{verb="read"}) - labels: - verb: read - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: apiserver_request:availability30d - - expr: |- - 1 - ( - ( - # too slow - sum by (cluster) (cluster_verb_scope:apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_count:increase30d{verb=~"POST|PUT|PATCH|DELETE"}) - - - sum by (cluster) (cluster_verb_scope_le:apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket:increase30d{verb=~"POST|PUT|PATCH|DELETE",le="1"}) - ) - + - # errors - sum by (cluster) (code:apiserver_request_total:increase30d{verb="write",code=~"5.."} or vector(0)) - ) - / - sum by (cluster) (code:apiserver_request_total:increase30d{verb="write"}) - labels: - verb: write - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: apiserver_request:availability30d - - expr: sum by (cluster,code,resource) (rate(apiserver_request_total{job="apiserver",verb=~"LIST|GET"}[5m])) - labels: - verb: read - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: code_resource:apiserver_request_total:rate5m - - expr: sum by (cluster,code,resource) (rate(apiserver_request_total{job="apiserver",verb=~"POST|PUT|PATCH|DELETE"}[5m])) - labels: - verb: write - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: code_resource:apiserver_request_total:rate5m - - expr: sum by (cluster, code, verb) (increase(apiserver_request_total{job="apiserver",verb=~"LIST|GET|POST|PUT|PATCH|DELETE",code=~"2.."}[1h])) - record: code_verb:apiserver_request_total:increase1h - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: sum by (cluster, code, verb) (increase(apiserver_request_total{job="apiserver",verb=~"LIST|GET|POST|PUT|PATCH|DELETE",code=~"3.."}[1h])) - record: code_verb:apiserver_request_total:increase1h - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: sum by (cluster, code, verb) (increase(apiserver_request_total{job="apiserver",verb=~"LIST|GET|POST|PUT|PATCH|DELETE",code=~"4.."}[1h])) - record: code_verb:apiserver_request_total:increase1h - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: sum by (cluster, code, verb) (increase(apiserver_request_total{job="apiserver",verb=~"LIST|GET|POST|PUT|PATCH|DELETE",code=~"5.."}[1h])) - record: code_verb:apiserver_request_total:increase1h - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-apiserver-burnrate.rules.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-apiserver-burnrate.rules.yaml deleted file mode 100644 index 694ff27300..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-apiserver-burnrate.rules.yaml +++ /dev/null @@ -1,370 +0,0 @@ -{{- /* -Generated from 'kube-apiserver-burnrate.rules' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubernetesControlPlane-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.kubeApiServer.enabled .Values.defaultRules.rules.kubeApiserverBurnrate }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "kube-apiserver-burnrate.rules" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: kube-apiserver-burnrate.rules - rules: - - expr: |- - ( - ( - # too slow - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_count{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward"}[1d])) - - - ( - ( - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope=~"resource|",le="1"}[1d])) - or - vector(0) - ) - + - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope="namespace",le="5"}[1d])) - + - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope="cluster",le="30"}[1d])) - ) - ) - + - # errors - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"LIST|GET",code=~"5.."}[1d])) - ) - / - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"LIST|GET"}[1d])) - labels: - verb: read - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: apiserver_request:burnrate1d - - expr: |- - ( - ( - # too slow - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_count{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward"}[1h])) - - - ( - ( - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope=~"resource|",le="1"}[1h])) - or - vector(0) - ) - + - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope="namespace",le="5"}[1h])) - + - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope="cluster",le="30"}[1h])) - ) - ) - + - # errors - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"LIST|GET",code=~"5.."}[1h])) - ) - / - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"LIST|GET"}[1h])) - labels: - verb: read - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: apiserver_request:burnrate1h - - expr: |- - ( - ( - # too slow - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_count{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward"}[2h])) - - - ( - ( - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope=~"resource|",le="1"}[2h])) - or - vector(0) - ) - + - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope="namespace",le="5"}[2h])) - + - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope="cluster",le="30"}[2h])) - ) - ) - + - # errors - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"LIST|GET",code=~"5.."}[2h])) - ) - / - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"LIST|GET"}[2h])) - labels: - verb: read - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: apiserver_request:burnrate2h - - expr: |- - ( - ( - # too slow - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_count{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward"}[30m])) - - - ( - ( - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope=~"resource|",le="1"}[30m])) - or - vector(0) - ) - + - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope="namespace",le="5"}[30m])) - + - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope="cluster",le="30"}[30m])) - ) - ) - + - # errors - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"LIST|GET",code=~"5.."}[30m])) - ) - / - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"LIST|GET"}[30m])) - labels: - verb: read - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: apiserver_request:burnrate30m - - expr: |- - ( - ( - # too slow - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_count{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward"}[3d])) - - - ( - ( - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope=~"resource|",le="1"}[3d])) - or - vector(0) - ) - + - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope="namespace",le="5"}[3d])) - + - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope="cluster",le="30"}[3d])) - ) - ) - + - # errors - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"LIST|GET",code=~"5.."}[3d])) - ) - / - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"LIST|GET"}[3d])) - labels: - verb: read - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: apiserver_request:burnrate3d - - expr: |- - ( - ( - # too slow - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_count{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward"}[5m])) - - - ( - ( - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope=~"resource|",le="1"}[5m])) - or - vector(0) - ) - + - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope="namespace",le="5"}[5m])) - + - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope="cluster",le="30"}[5m])) - ) - ) - + - # errors - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"LIST|GET",code=~"5.."}[5m])) - ) - / - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"LIST|GET"}[5m])) - labels: - verb: read - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: apiserver_request:burnrate5m - - expr: |- - ( - ( - # too slow - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_count{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward"}[6h])) - - - ( - ( - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope=~"resource|",le="1"}[6h])) - or - vector(0) - ) - + - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope="namespace",le="5"}[6h])) - + - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward",scope="cluster",le="30"}[6h])) - ) - ) - + - # errors - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"LIST|GET",code=~"5.."}[6h])) - ) - / - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"LIST|GET"}[6h])) - labels: - verb: read - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: apiserver_request:burnrate6h - - expr: |- - ( - ( - # too slow - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_count{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",subresource!~"proxy|attach|log|exec|portforward"}[1d])) - - - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",subresource!~"proxy|attach|log|exec|portforward",le="1"}[1d])) - ) - + - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",code=~"5.."}[1d])) - ) - / - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"POST|PUT|PATCH|DELETE"}[1d])) - labels: - verb: write - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: apiserver_request:burnrate1d - - expr: |- - ( - ( - # too slow - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_count{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",subresource!~"proxy|attach|log|exec|portforward"}[1h])) - - - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",subresource!~"proxy|attach|log|exec|portforward",le="1"}[1h])) - ) - + - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",code=~"5.."}[1h])) - ) - / - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"POST|PUT|PATCH|DELETE"}[1h])) - labels: - verb: write - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: apiserver_request:burnrate1h - - expr: |- - ( - ( - # too slow - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_count{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",subresource!~"proxy|attach|log|exec|portforward"}[2h])) - - - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",subresource!~"proxy|attach|log|exec|portforward",le="1"}[2h])) - ) - + - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",code=~"5.."}[2h])) - ) - / - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"POST|PUT|PATCH|DELETE"}[2h])) - labels: - verb: write - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: apiserver_request:burnrate2h - - expr: |- - ( - ( - # too slow - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_count{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",subresource!~"proxy|attach|log|exec|portforward"}[30m])) - - - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",subresource!~"proxy|attach|log|exec|portforward",le="1"}[30m])) - ) - + - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",code=~"5.."}[30m])) - ) - / - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"POST|PUT|PATCH|DELETE"}[30m])) - labels: - verb: write - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: apiserver_request:burnrate30m - - expr: |- - ( - ( - # too slow - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_count{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",subresource!~"proxy|attach|log|exec|portforward"}[3d])) - - - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",subresource!~"proxy|attach|log|exec|portforward",le="1"}[3d])) - ) - + - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",code=~"5.."}[3d])) - ) - / - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"POST|PUT|PATCH|DELETE"}[3d])) - labels: - verb: write - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: apiserver_request:burnrate3d - - expr: |- - ( - ( - # too slow - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_count{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",subresource!~"proxy|attach|log|exec|portforward"}[5m])) - - - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",subresource!~"proxy|attach|log|exec|portforward",le="1"}[5m])) - ) - + - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",code=~"5.."}[5m])) - ) - / - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"POST|PUT|PATCH|DELETE"}[5m])) - labels: - verb: write - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: apiserver_request:burnrate5m - - expr: |- - ( - ( - # too slow - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_count{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",subresource!~"proxy|attach|log|exec|portforward"}[6h])) - - - sum by (cluster) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",subresource!~"proxy|attach|log|exec|portforward",le="1"}[6h])) - ) - + - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",code=~"5.."}[6h])) - ) - / - sum by (cluster) (rate(apiserver_request_total{job="apiserver",verb=~"POST|PUT|PATCH|DELETE"}[6h])) - labels: - verb: write - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: apiserver_request:burnrate6h -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-apiserver-histogram.rules.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-apiserver-histogram.rules.yaml deleted file mode 100644 index 0de9058661..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-apiserver-histogram.rules.yaml +++ /dev/null @@ -1,43 +0,0 @@ -{{- /* -Generated from 'kube-apiserver-histogram.rules' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubernetesControlPlane-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.kubeApiServer.enabled .Values.defaultRules.rules.kubeApiserverHistogram }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "kube-apiserver-histogram.rules" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: kube-apiserver-histogram.rules - rules: - - expr: histogram_quantile(0.99, sum by (cluster, le, resource) (rate(apiserver_request{{ if (semverCompare ">=1.23.0-0" $kubeTargetVersion) }}_slo{{ end }}_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward"}[5m]))) > 0 - labels: - quantile: '0.99' - verb: read - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: cluster_quantile:apiserver_request_slo_duration_seconds:histogram_quantile - - expr: histogram_quantile(0.99, sum by (cluster, le, resource) (rate(apiserver_request_slo_duration_seconds_bucket{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",subresource!~"proxy|attach|log|exec|portforward"}[5m]))) > 0 - labels: - quantile: '0.99' - verb: write - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: cluster_quantile:apiserver_request_slo_duration_seconds:histogram_quantile -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-apiserver-slos.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-apiserver-slos.yaml deleted file mode 100644 index 8039f4a728..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-apiserver-slos.yaml +++ /dev/null @@ -1,115 +0,0 @@ -{{- /* -Generated from 'kube-apiserver-slos' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubernetesControlPlane-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.kubeApiServer.enabled .Values.defaultRules.rules.kubeApiserverSlos }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "kube-apiserver-slos" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: kube-apiserver-slos - rules: -{{- if not (.Values.defaultRules.disabled.KubeAPIErrorBudgetBurn | default false) }} - - alert: KubeAPIErrorBudgetBurn - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: The API server is burning too much error budget. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeapierrorbudgetburn - summary: The API server is burning too much error budget. - expr: |- - sum(apiserver_request:burnrate1h) > (14.40 * 0.01000) - and - sum(apiserver_request:burnrate5m) > (14.40 * 0.01000) - for: 2m - labels: - long: 1h - severity: critical - short: 5m - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeAPIErrorBudgetBurn | default false) }} - - alert: KubeAPIErrorBudgetBurn - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: The API server is burning too much error budget. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeapierrorbudgetburn - summary: The API server is burning too much error budget. - expr: |- - sum(apiserver_request:burnrate6h) > (6.00 * 0.01000) - and - sum(apiserver_request:burnrate30m) > (6.00 * 0.01000) - for: 15m - labels: - long: 6h - severity: critical - short: 30m - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeAPIErrorBudgetBurn | default false) }} - - alert: KubeAPIErrorBudgetBurn - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: The API server is burning too much error budget. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeapierrorbudgetburn - summary: The API server is burning too much error budget. - expr: |- - sum(apiserver_request:burnrate1d) > (3.00 * 0.01000) - and - sum(apiserver_request:burnrate2h) > (3.00 * 0.01000) - for: 1h - labels: - long: 1d - severity: warning - short: 2h - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeAPIErrorBudgetBurn | default false) }} - - alert: KubeAPIErrorBudgetBurn - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: The API server is burning too much error budget. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeapierrorbudgetburn - summary: The API server is burning too much error budget. - expr: |- - sum(apiserver_request:burnrate3d) > (1.00 * 0.01000) - and - sum(apiserver_request:burnrate6h) > (1.00 * 0.01000) - for: 3h - labels: - long: 3d - severity: warning - short: 6h - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-prometheus-general.rules.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-prometheus-general.rules.yaml deleted file mode 100644 index 5cb047c200..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-prometheus-general.rules.yaml +++ /dev/null @@ -1,39 +0,0 @@ -{{- /* -Generated from 'kube-prometheus-general.rules' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubePrometheus-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.kubePrometheusGeneral }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "kube-prometheus-general.rules" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: kube-prometheus-general.rules - rules: - - expr: count without(instance, pod, node) (up == 1) - record: count:up1 - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: count without(instance, pod, node) (up == 0) - record: count:up0 - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-prometheus-node-recording.rules.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-prometheus-node-recording.rules.yaml deleted file mode 100644 index c069137b1f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-prometheus-node-recording.rules.yaml +++ /dev/null @@ -1,63 +0,0 @@ -{{- /* -Generated from 'kube-prometheus-node-recording.rules' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubePrometheus-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.kubePrometheusNodeRecording }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "kube-prometheus-node-recording.rules" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: kube-prometheus-node-recording.rules - rules: - - expr: sum(rate(node_cpu_seconds_total{mode!="idle",mode!="iowait",mode!="steal"}[3m])) BY (instance) - record: instance:node_cpu:rate:sum - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: sum(rate(node_network_receive_bytes_total[3m])) BY (instance) - record: instance:node_network_receive_bytes:rate:sum - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: sum(rate(node_network_transmit_bytes_total[3m])) BY (instance) - record: instance:node_network_transmit_bytes:rate:sum - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: sum(rate(node_cpu_seconds_total{mode!="idle",mode!="iowait",mode!="steal"}[5m])) WITHOUT (cpu, mode) / ON(instance) GROUP_LEFT() count(sum(node_cpu_seconds_total) BY (instance, cpu)) BY (instance) - record: instance:node_cpu:ratio - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: sum(rate(node_cpu_seconds_total{mode!="idle",mode!="iowait",mode!="steal"}[5m])) - record: cluster:node_cpu:sum_rate5m - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: cluster:node_cpu:sum_rate5m / count(sum(node_cpu_seconds_total) BY (instance, cpu)) - record: cluster:node_cpu:ratio - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-scheduler.rules.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-scheduler.rules.yaml deleted file mode 100644 index 9d44471bd8..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-scheduler.rules.yaml +++ /dev/null @@ -1,90 +0,0 @@ -{{- /* -Generated from 'kube-scheduler.rules' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubernetesControlPlane-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.kubeScheduler.enabled .Values.defaultRules.rules.kubeSchedulerRecording }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "kube-scheduler.rules" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: kube-scheduler.rules - rules: - - expr: histogram_quantile(0.99, sum(rate(scheduler_e2e_scheduling_duration_seconds_bucket{job="{{ include "exporter.kubeScheduler.jobName" . }}"}[5m])) without(instance, pod)) - labels: - quantile: '0.99' - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: cluster_quantile:scheduler_e2e_scheduling_duration_seconds:histogram_quantile - - expr: histogram_quantile(0.99, sum(rate(scheduler_scheduling_algorithm_duration_seconds_bucket{job="{{ include "exporter.kubeScheduler.jobName" . }}"}[5m])) without(instance, pod)) - labels: - quantile: '0.99' - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: cluster_quantile:scheduler_scheduling_algorithm_duration_seconds:histogram_quantile - - expr: histogram_quantile(0.99, sum(rate(scheduler_binding_duration_seconds_bucket{job="{{ include "exporter.kubeScheduler.jobName" . }}"}[5m])) without(instance, pod)) - labels: - quantile: '0.99' - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: cluster_quantile:scheduler_binding_duration_seconds:histogram_quantile - - expr: histogram_quantile(0.9, sum(rate(scheduler_e2e_scheduling_duration_seconds_bucket{job="{{ include "exporter.kubeScheduler.jobName" . }}"}[5m])) without(instance, pod)) - labels: - quantile: '0.9' - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: cluster_quantile:scheduler_e2e_scheduling_duration_seconds:histogram_quantile - - expr: histogram_quantile(0.9, sum(rate(scheduler_scheduling_algorithm_duration_seconds_bucket{job="{{ include "exporter.kubeScheduler.jobName" . }}"}[5m])) without(instance, pod)) - labels: - quantile: '0.9' - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: cluster_quantile:scheduler_scheduling_algorithm_duration_seconds:histogram_quantile - - expr: histogram_quantile(0.9, sum(rate(scheduler_binding_duration_seconds_bucket{job="{{ include "exporter.kubeScheduler.jobName" . }}"}[5m])) without(instance, pod)) - labels: - quantile: '0.9' - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: cluster_quantile:scheduler_binding_duration_seconds:histogram_quantile - - expr: histogram_quantile(0.5, sum(rate(scheduler_e2e_scheduling_duration_seconds_bucket{job="{{ include "exporter.kubeScheduler.jobName" . }}"}[5m])) without(instance, pod)) - labels: - quantile: '0.5' - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: cluster_quantile:scheduler_e2e_scheduling_duration_seconds:histogram_quantile - - expr: histogram_quantile(0.5, sum(rate(scheduler_scheduling_algorithm_duration_seconds_bucket{job="{{ include "exporter.kubeScheduler.jobName" . }}"}[5m])) without(instance, pod)) - labels: - quantile: '0.5' - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: cluster_quantile:scheduler_scheduling_algorithm_duration_seconds:histogram_quantile - - expr: histogram_quantile(0.5, sum(rate(scheduler_binding_duration_seconds_bucket{job="{{ include "exporter.kubeScheduler.jobName" . }}"}[5m])) without(instance, pod)) - labels: - quantile: '0.5' - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: cluster_quantile:scheduler_binding_duration_seconds:histogram_quantile -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-state-metrics.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-state-metrics.yaml deleted file mode 100644 index edbf0fcd9a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kube-state-metrics.yaml +++ /dev/null @@ -1,107 +0,0 @@ -{{- /* -Generated from 'kube-state-metrics' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubeStateMetrics-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.kubeStateMetrics }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "kube-state-metrics" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: kube-state-metrics - rules: -{{- if not (.Values.defaultRules.disabled.KubeStateMetricsListErrors | default false) }} - - alert: KubeStateMetricsListErrors - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: kube-state-metrics is experiencing errors at an elevated rate in list operations. This is likely causing it to not be able to expose metrics about Kubernetes objects correctly or at all. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kube-state-metrics/kubestatemetricslisterrors - summary: kube-state-metrics is experiencing errors in list operations. - expr: |- - (sum(rate(kube_state_metrics_list_total{job="kube-state-metrics",result="error"}[5m])) by (cluster) - / - sum(rate(kube_state_metrics_list_total{job="kube-state-metrics"}[5m])) by (cluster)) - > 0.01 - for: 15m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeStateMetricsWatchErrors | default false) }} - - alert: KubeStateMetricsWatchErrors - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: kube-state-metrics is experiencing errors at an elevated rate in watch operations. This is likely causing it to not be able to expose metrics about Kubernetes objects correctly or at all. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kube-state-metrics/kubestatemetricswatcherrors - summary: kube-state-metrics is experiencing errors in watch operations. - expr: |- - (sum(rate(kube_state_metrics_watch_total{job="kube-state-metrics",result="error"}[5m])) by (cluster) - / - sum(rate(kube_state_metrics_watch_total{job="kube-state-metrics"}[5m])) by (cluster)) - > 0.01 - for: 15m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeStateMetricsShardingMismatch | default false) }} - - alert: KubeStateMetricsShardingMismatch - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: kube-state-metrics pods are running with different --total-shards configuration, some Kubernetes objects may be exposed multiple times or not exposed at all. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kube-state-metrics/kubestatemetricsshardingmismatch - summary: kube-state-metrics sharding is misconfigured. - expr: stdvar (kube_state_metrics_total_shards{job="kube-state-metrics"}) by (cluster) != 0 - for: 15m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeStateMetricsShardsMissing | default false) }} - - alert: KubeStateMetricsShardsMissing - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: kube-state-metrics shards are missing, some Kubernetes objects are not being exposed. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kube-state-metrics/kubestatemetricsshardsmissing - summary: kube-state-metrics shards are missing. - expr: |- - 2^max(kube_state_metrics_total_shards{job="kube-state-metrics"}) by (cluster) - 1 - - - sum( 2 ^ max by (cluster, shard_ordinal) (kube_state_metrics_shard_ordinal{job="kube-state-metrics"}) ) by (cluster) - != 0 - for: 15m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubelet.rules.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubelet.rules.yaml deleted file mode 100644 index 71d0221380..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubelet.rules.yaml +++ /dev/null @@ -1,50 +0,0 @@ -{{- /* -Generated from 'kubelet.rules' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubernetesControlPlane-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.kubelet }} -{{- if (include "exporter.kubelet.enabled" .)}} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "kubelet.rules" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: kubelet.rules - rules: - - expr: histogram_quantile(0.99, sum(rate(kubelet_pleg_relist_duration_seconds_bucket{job="kubelet", metrics_path="/metrics"}[5m])) by (cluster, instance, le) * on(cluster, instance) group_left(node) kubelet_node_name{job="kubelet", metrics_path="/metrics"}) - labels: - quantile: '0.99' - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: node_quantile:kubelet_pleg_relist_duration_seconds:histogram_quantile - - expr: histogram_quantile(0.9, sum(rate(kubelet_pleg_relist_duration_seconds_bucket{job="kubelet", metrics_path="/metrics"}[5m])) by (cluster, instance, le) * on(cluster, instance) group_left(node) kubelet_node_name{job="kubelet", metrics_path="/metrics"}) - labels: - quantile: '0.9' - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: node_quantile:kubelet_pleg_relist_duration_seconds:histogram_quantile - - expr: histogram_quantile(0.5, sum(rate(kubelet_pleg_relist_duration_seconds_bucket{job="kubelet", metrics_path="/metrics"}[5m])) by (cluster, instance, le) * on(cluster, instance) group_left(node) kubelet_node_name{job="kubelet", metrics_path="/metrics"}) - labels: - quantile: '0.5' - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - record: node_quantile:kubelet_pleg_relist_duration_seconds:histogram_quantile -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-apps.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-apps.yaml deleted file mode 100644 index c8d02089a0..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-apps.yaml +++ /dev/null @@ -1,375 +0,0 @@ -{{- /* -Generated from 'kubernetes-apps' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubernetesControlPlane-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.kubernetesApps }} -{{- $targetNamespace := .Values.defaultRules.appNamespacesTarget }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "kubernetes-apps" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: kubernetes-apps - rules: -{{- if not (.Values.defaultRules.disabled.KubePodCrashLooping | default false) }} - - alert: KubePodCrashLooping - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: 'Pod {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.pod {{`}}`}} ({{`{{`}} $labels.container {{`}}`}}) is in waiting state (reason: "CrashLoopBackOff").' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubepodcrashlooping - summary: Pod is crash looping. - expr: max_over_time(kube_pod_container_status_waiting_reason{reason="CrashLoopBackOff", job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"}[5m]) >= 1 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubePodNotReady | default false) }} - - alert: KubePodNotReady - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Pod {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.pod {{`}}`}} has been in a non-ready state for longer than 15 minutes. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubepodnotready - summary: Pod has been in a non-ready state for more than 15 minutes. - expr: |- - sum by (namespace, pod, cluster) ( - max by(namespace, pod, cluster) ( - kube_pod_status_phase{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}", phase=~"Pending|Unknown|Failed"} - ) * on(namespace, pod, cluster) group_left(owner_kind) topk by(namespace, pod, cluster) ( - 1, max by(namespace, pod, owner_kind, cluster) (kube_pod_owner{owner_kind!="Job"}) - ) - ) > 0 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeDeploymentGenerationMismatch | default false) }} - - alert: KubeDeploymentGenerationMismatch - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Deployment generation for {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.deployment {{`}}`}} does not match, this indicates that the Deployment has failed but has not been rolled back. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubedeploymentgenerationmismatch - summary: Deployment generation mismatch due to possible roll-back - expr: |- - kube_deployment_status_observed_generation{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - != - kube_deployment_metadata_generation{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeDeploymentReplicasMismatch | default false) }} - - alert: KubeDeploymentReplicasMismatch - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Deployment {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.deployment {{`}}`}} has not matched the expected number of replicas for longer than 15 minutes. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubedeploymentreplicasmismatch - summary: Deployment has not matched the expected number of replicas. - expr: |- - ( - kube_deployment_spec_replicas{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - > - kube_deployment_status_replicas_available{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - ) and ( - changes(kube_deployment_status_replicas_updated{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"}[10m]) - == - 0 - ) - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeStatefulSetReplicasMismatch | default false) }} - - alert: KubeStatefulSetReplicasMismatch - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: StatefulSet {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.statefulset {{`}}`}} has not matched the expected number of replicas for longer than 15 minutes. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubestatefulsetreplicasmismatch - summary: Deployment has not matched the expected number of replicas. - expr: |- - ( - kube_statefulset_status_replicas_ready{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - != - kube_statefulset_status_replicas{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - ) and ( - changes(kube_statefulset_status_replicas_updated{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"}[10m]) - == - 0 - ) - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeStatefulSetGenerationMismatch | default false) }} - - alert: KubeStatefulSetGenerationMismatch - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: StatefulSet generation for {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.statefulset {{`}}`}} does not match, this indicates that the StatefulSet has failed but has not been rolled back. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubestatefulsetgenerationmismatch - summary: StatefulSet generation mismatch due to possible roll-back - expr: |- - kube_statefulset_status_observed_generation{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - != - kube_statefulset_metadata_generation{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeStatefulSetUpdateNotRolledOut | default false) }} - - alert: KubeStatefulSetUpdateNotRolledOut - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: StatefulSet {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.statefulset {{`}}`}} update has not been rolled out. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubestatefulsetupdatenotrolledout - summary: StatefulSet update has not been rolled out. - expr: |- - ( - max without (revision) ( - kube_statefulset_status_current_revision{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - unless - kube_statefulset_status_update_revision{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - ) - * - ( - kube_statefulset_replicas{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - != - kube_statefulset_status_replicas_updated{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - ) - ) and ( - changes(kube_statefulset_status_replicas_updated{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"}[5m]) - == - 0 - ) - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeDaemonSetRolloutStuck | default false) }} - - alert: KubeDaemonSetRolloutStuck - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: DaemonSet {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.daemonset {{`}}`}} has not finished or progressed for at least 15 minutes. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubedaemonsetrolloutstuck - summary: DaemonSet rollout is stuck. - expr: |- - ( - ( - kube_daemonset_status_current_number_scheduled{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - != - kube_daemonset_status_desired_number_scheduled{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - ) or ( - kube_daemonset_status_number_misscheduled{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - != - 0 - ) or ( - kube_daemonset_status_updated_number_scheduled{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - != - kube_daemonset_status_desired_number_scheduled{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - ) or ( - kube_daemonset_status_number_available{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - != - kube_daemonset_status_desired_number_scheduled{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - ) - ) and ( - changes(kube_daemonset_status_updated_number_scheduled{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"}[5m]) - == - 0 - ) - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeContainerWaiting | default false) }} - - alert: KubeContainerWaiting - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: pod/{{`{{`}} $labels.pod {{`}}`}} in namespace {{`{{`}} $labels.namespace {{`}}`}} on container {{`{{`}} $labels.container{{`}}`}} has been in waiting state for longer than 1 hour. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubecontainerwaiting - summary: Pod container waiting longer than 1 hour - expr: sum by (namespace, pod, container, cluster) (kube_pod_container_status_waiting_reason{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"}) > 0 - for: 1h - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeDaemonSetNotScheduled | default false) }} - - alert: KubeDaemonSetNotScheduled - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: '{{`{{`}} $value {{`}}`}} Pods of DaemonSet {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.daemonset {{`}}`}} are not scheduled.' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubedaemonsetnotscheduled - summary: DaemonSet pods are not scheduled. - expr: |- - kube_daemonset_status_desired_number_scheduled{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - - - kube_daemonset_status_current_number_scheduled{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} > 0 - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeDaemonSetMisScheduled | default false) }} - - alert: KubeDaemonSetMisScheduled - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: '{{`{{`}} $value {{`}}`}} Pods of DaemonSet {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.daemonset {{`}}`}} are running where they are not supposed to run.' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubedaemonsetmisscheduled - summary: DaemonSet pods are misscheduled. - expr: kube_daemonset_status_number_misscheduled{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} > 0 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeJobNotCompleted | default false) }} - - alert: KubeJobNotCompleted - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Job {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.job_name {{`}}`}} is taking more than {{`{{`}} "43200" | humanizeDuration {{`}}`}} to complete. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubejobnotcompleted - summary: Job did not complete in time - expr: |- - time() - max by(namespace, job_name, cluster) (kube_job_status_start_time{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - and - kube_job_status_active{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} > 0) > 43200 - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeJobFailed | default false) }} - - alert: KubeJobFailed - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Job {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.job_name {{`}}`}} failed to complete. Removing failed job after investigation should clear this alert. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubejobfailed - summary: Job failed to complete. - expr: kube_job_failed{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} > 0 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeHpaReplicasMismatch | default false) }} - - alert: KubeHpaReplicasMismatch - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: HPA {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.horizontalpodautoscaler {{`}}`}} has not matched the desired number of replicas for longer than 15 minutes. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubehpareplicasmismatch - summary: HPA has not matched desired number of replicas. - expr: |- - (kube_horizontalpodautoscaler_status_desired_replicas{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - != - kube_horizontalpodautoscaler_status_current_replicas{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"}) - and - (kube_horizontalpodautoscaler_status_current_replicas{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - > - kube_horizontalpodautoscaler_spec_min_replicas{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"}) - and - (kube_horizontalpodautoscaler_status_current_replicas{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - < - kube_horizontalpodautoscaler_spec_max_replicas{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"}) - and - changes(kube_horizontalpodautoscaler_status_current_replicas{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"}[15m]) == 0 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeHpaMaxedOut | default false) }} - - alert: KubeHpaMaxedOut - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: HPA {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.horizontalpodautoscaler {{`}}`}} has been running at max replicas for longer than 15 minutes. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubehpamaxedout - summary: HPA is running at max replicas - expr: |- - kube_horizontalpodautoscaler_status_current_replicas{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - == - kube_horizontalpodautoscaler_spec_max_replicas{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}"} - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-resources.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-resources.yaml deleted file mode 100644 index ada980f19b..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-resources.yaml +++ /dev/null @@ -1,193 +0,0 @@ -{{- /* -Generated from 'kubernetes-resources' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubernetesControlPlane-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.kubernetesResources }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "kubernetes-resources" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: kubernetes-resources - rules: -{{- if not (.Values.defaultRules.disabled.KubeCPUOvercommit | default false) }} - - alert: KubeCPUOvercommit - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Cluster has overcommitted CPU resource requests for Pods by {{`{{`}} $value {{`}}`}} CPU shares and cannot tolerate node failure. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubecpuovercommit - summary: Cluster has overcommitted CPU resource requests. - expr: |- - sum(namespace_cpu:kube_pod_container_resource_requests:sum{}) - (sum(kube_node_status_allocatable{resource="cpu", job="kube-state-metrics"}) - max(kube_node_status_allocatable{resource="cpu", job="kube-state-metrics"})) > 0 - and - (sum(kube_node_status_allocatable{resource="cpu", job="kube-state-metrics"}) - max(kube_node_status_allocatable{resource="cpu", job="kube-state-metrics"})) > 0 - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeMemoryOvercommit | default false) }} - - alert: KubeMemoryOvercommit - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Cluster has overcommitted memory resource requests for Pods by {{`{{`}} $value | humanize {{`}}`}} bytes and cannot tolerate node failure. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubememoryovercommit - summary: Cluster has overcommitted memory resource requests. - expr: |- - sum(namespace_memory:kube_pod_container_resource_requests:sum{}) - (sum(kube_node_status_allocatable{resource="memory", job="kube-state-metrics"}) - max(kube_node_status_allocatable{resource="memory", job="kube-state-metrics"})) > 0 - and - (sum(kube_node_status_allocatable{resource="memory", job="kube-state-metrics"}) - max(kube_node_status_allocatable{resource="memory", job="kube-state-metrics"})) > 0 - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeCPUQuotaOvercommit | default false) }} - - alert: KubeCPUQuotaOvercommit - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Cluster has overcommitted CPU resource requests for Namespaces. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubecpuquotaovercommit - summary: Cluster has overcommitted CPU resource requests. - expr: |- - sum(min without(resource) (kube_resourcequota{job="kube-state-metrics", type="hard", resource=~"(cpu|requests.cpu)"})) - / - sum(kube_node_status_allocatable{resource="cpu", job="kube-state-metrics"}) - > 1.5 - for: 5m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeMemoryQuotaOvercommit | default false) }} - - alert: KubeMemoryQuotaOvercommit - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Cluster has overcommitted memory resource requests for Namespaces. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubememoryquotaovercommit - summary: Cluster has overcommitted memory resource requests. - expr: |- - sum(min without(resource) (kube_resourcequota{job="kube-state-metrics", type="hard", resource=~"(memory|requests.memory)"})) - / - sum(kube_node_status_allocatable{resource="memory", job="kube-state-metrics"}) - > 1.5 - for: 5m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeQuotaAlmostFull | default false) }} - - alert: KubeQuotaAlmostFull - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Namespace {{`{{`}} $labels.namespace {{`}}`}} is using {{`{{`}} $value | humanizePercentage {{`}}`}} of its {{`{{`}} $labels.resource {{`}}`}} quota. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubequotaalmostfull - summary: Namespace quota is going to be full. - expr: |- - kube_resourcequota{job="kube-state-metrics", type="used"} - / ignoring(instance, job, type) - (kube_resourcequota{job="kube-state-metrics", type="hard"} > 0) - > 0.9 < 1 - for: 15m - labels: - severity: info - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeQuotaFullyUsed | default false) }} - - alert: KubeQuotaFullyUsed - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Namespace {{`{{`}} $labels.namespace {{`}}`}} is using {{`{{`}} $value | humanizePercentage {{`}}`}} of its {{`{{`}} $labels.resource {{`}}`}} quota. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubequotafullyused - summary: Namespace quota is fully used. - expr: |- - kube_resourcequota{job="kube-state-metrics", type="used"} - / ignoring(instance, job, type) - (kube_resourcequota{job="kube-state-metrics", type="hard"} > 0) - == 1 - for: 15m - labels: - severity: info - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeQuotaExceeded | default false) }} - - alert: KubeQuotaExceeded - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Namespace {{`{{`}} $labels.namespace {{`}}`}} is using {{`{{`}} $value | humanizePercentage {{`}}`}} of its {{`{{`}} $labels.resource {{`}}`}} quota. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubequotaexceeded - summary: Namespace quota has exceeded the limits. - expr: |- - kube_resourcequota{job="kube-state-metrics", type="used"} - / ignoring(instance, job, type) - (kube_resourcequota{job="kube-state-metrics", type="hard"} > 0) - > 1 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.CPUThrottlingHigh | default false) }} - - alert: CPUThrottlingHigh - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: '{{`{{`}} $value | humanizePercentage {{`}}`}} throttling of CPU in namespace {{`{{`}} $labels.namespace {{`}}`}} for container {{`{{`}} $labels.container {{`}}`}} in pod {{`{{`}} $labels.pod {{`}}`}}.' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/cputhrottlinghigh - summary: Processes experience elevated CPU throttling. - expr: |- - sum(increase(container_cpu_cfs_throttled_periods_total{container!="", }[5m])) by (container, pod, namespace) - / - sum(increase(container_cpu_cfs_periods_total{}[5m])) by (container, pod, namespace) - > ( 25 / 100 ) - for: 15m - labels: - severity: info - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-storage.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-storage.yaml deleted file mode 100644 index 0c9a1a245d..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-storage.yaml +++ /dev/null @@ -1,160 +0,0 @@ -{{- /* -Generated from 'kubernetes-storage' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubernetesControlPlane-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.kubernetesStorage }} -{{- $targetNamespace := .Values.defaultRules.appNamespacesTarget }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "kubernetes-storage" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: kubernetes-storage - rules: -{{- if not (.Values.defaultRules.disabled.KubePersistentVolumeFillingUp | default false) }} - - alert: KubePersistentVolumeFillingUp - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: The PersistentVolume claimed by {{`{{`}} $labels.persistentvolumeclaim {{`}}`}} in Namespace {{`{{`}} $labels.namespace {{`}}`}} is only {{`{{`}} $value | humanizePercentage {{`}}`}} free. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubepersistentvolumefillingup - summary: PersistentVolume is filling up. - expr: |- - kubelet_volume_stats_available_bytes{job="{{ include "exporter.kubelet.jobName" . }}", namespace=~"{{ $targetNamespace }}", metrics_path="/metrics"} - / - kubelet_volume_stats_capacity_bytes{job="{{ include "exporter.kubelet.jobName" . }}", namespace=~"{{ $targetNamespace }}", metrics_path="/metrics"} - < 0.03 - and - kubelet_volume_stats_used_bytes{job="{{ include "exporter.kubelet.jobName" . }}", namespace=~"{{ $targetNamespace }}", metrics_path="/metrics"} > 0 - unless on(namespace, persistentvolumeclaim) - kube_persistentvolumeclaim_access_mode{ access_mode="ReadOnlyMany"} == 1 - unless on(namespace, persistentvolumeclaim) - kube_persistentvolumeclaim_labels{label_excluded_from_alerts="true"} == 1 - for: 1m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubePersistentVolumeFillingUp | default false) }} - - alert: KubePersistentVolumeFillingUp - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Based on recent sampling, the PersistentVolume claimed by {{`{{`}} $labels.persistentvolumeclaim {{`}}`}} in Namespace {{`{{`}} $labels.namespace {{`}}`}} is expected to fill up within four days. Currently {{`{{`}} $value | humanizePercentage {{`}}`}} is available. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubepersistentvolumefillingup - summary: PersistentVolume is filling up. - expr: |- - ( - kubelet_volume_stats_available_bytes{job="{{ include "exporter.kubelet.jobName" . }}", namespace=~"{{ $targetNamespace }}", metrics_path="/metrics"} - / - kubelet_volume_stats_capacity_bytes{job="{{ include "exporter.kubelet.jobName" . }}", namespace=~"{{ $targetNamespace }}", metrics_path="/metrics"} - ) < 0.15 - and - kubelet_volume_stats_used_bytes{job="{{ include "exporter.kubelet.jobName" . }}", namespace=~"{{ $targetNamespace }}", metrics_path="/metrics"} > 0 - and - predict_linear(kubelet_volume_stats_available_bytes{job="{{ include "exporter.kubelet.jobName" . }}", namespace=~"{{ $targetNamespace }}", metrics_path="/metrics"}[6h], 4 * 24 * 3600) < 0 - unless on(namespace, persistentvolumeclaim) - kube_persistentvolumeclaim_access_mode{ access_mode="ReadOnlyMany"} == 1 - unless on(namespace, persistentvolumeclaim) - kube_persistentvolumeclaim_labels{label_excluded_from_alerts="true"} == 1 - for: 1h - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubePersistentVolumeInodesFillingUp | default false) }} - - alert: KubePersistentVolumeInodesFillingUp - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: The PersistentVolume claimed by {{`{{`}} $labels.persistentvolumeclaim {{`}}`}} in Namespace {{`{{`}} $labels.namespace {{`}}`}} only has {{`{{`}} $value | humanizePercentage {{`}}`}} free inodes. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubepersistentvolumeinodesfillingup - summary: PersistentVolumeInodes are filling up. - expr: |- - ( - kubelet_volume_stats_inodes_free{job="{{ include "exporter.kubelet.jobName" . }}", namespace=~"{{ $targetNamespace }}", metrics_path="/metrics"} - / - kubelet_volume_stats_inodes{job="{{ include "exporter.kubelet.jobName" . }}", namespace=~"{{ $targetNamespace }}", metrics_path="/metrics"} - ) < 0.03 - and - kubelet_volume_stats_inodes_used{job="{{ include "exporter.kubelet.jobName" . }}", namespace=~"{{ $targetNamespace }}", metrics_path="/metrics"} > 0 - unless on(namespace, persistentvolumeclaim) - kube_persistentvolumeclaim_access_mode{ access_mode="ReadOnlyMany"} == 1 - unless on(namespace, persistentvolumeclaim) - kube_persistentvolumeclaim_labels{label_excluded_from_alerts="true"} == 1 - for: 1m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubePersistentVolumeInodesFillingUp | default false) }} - - alert: KubePersistentVolumeInodesFillingUp - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Based on recent sampling, the PersistentVolume claimed by {{`{{`}} $labels.persistentvolumeclaim {{`}}`}} in Namespace {{`{{`}} $labels.namespace {{`}}`}} is expected to run out of inodes within four days. Currently {{`{{`}} $value | humanizePercentage {{`}}`}} of its inodes are free. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubepersistentvolumeinodesfillingup - summary: PersistentVolumeInodes are filling up. - expr: |- - ( - kubelet_volume_stats_inodes_free{job="{{ include "exporter.kubelet.jobName" . }}", namespace=~"{{ $targetNamespace }}", metrics_path="/metrics"} - / - kubelet_volume_stats_inodes{job="{{ include "exporter.kubelet.jobName" . }}", namespace=~"{{ $targetNamespace }}", metrics_path="/metrics"} - ) < 0.15 - and - kubelet_volume_stats_inodes_used{job="{{ include "exporter.kubelet.jobName" . }}", namespace=~"{{ $targetNamespace }}", metrics_path="/metrics"} > 0 - and - predict_linear(kubelet_volume_stats_inodes_free{job="{{ include "exporter.kubelet.jobName" . }}", namespace=~"{{ $targetNamespace }}", metrics_path="/metrics"}[6h], 4 * 24 * 3600) < 0 - unless on(namespace, persistentvolumeclaim) - kube_persistentvolumeclaim_access_mode{ access_mode="ReadOnlyMany"} == 1 - unless on(namespace, persistentvolumeclaim) - kube_persistentvolumeclaim_labels{label_excluded_from_alerts="true"} == 1 - for: 1h - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubePersistentVolumeErrors | default false) }} - - alert: KubePersistentVolumeErrors - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: The persistent volume {{`{{`}} $labels.persistentvolume {{`}}`}} has status {{`{{`}} $labels.phase {{`}}`}}. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubepersistentvolumeerrors - summary: PersistentVolume is having issues with provisioning. - expr: kube_persistentvolume_status_phase{phase=~"Failed|Pending",job="kube-state-metrics"} > 0 - for: 5m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-apiserver.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-apiserver.yaml deleted file mode 100644 index f4b9e470e4..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-apiserver.yaml +++ /dev/null @@ -1,130 +0,0 @@ -{{- /* -Generated from 'kubernetes-system-apiserver' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubernetesControlPlane-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.kubernetesSystem }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "kubernetes-system-apiserver" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: kubernetes-system-apiserver - rules: -{{- if not (.Values.defaultRules.disabled.KubeClientCertificateExpiration | default false) }} - - alert: KubeClientCertificateExpiration - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: A client certificate used to authenticate to kubernetes apiserver is expiring in less than 7.0 days. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeclientcertificateexpiration - summary: Client certificate is about to expire. - expr: apiserver_client_certificate_expiration_seconds_count{job="apiserver"} > 0 and on(job) histogram_quantile(0.01, sum by (job, le) (rate(apiserver_client_certificate_expiration_seconds_bucket{job="apiserver"}[5m]))) < 604800 - for: 5m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeClientCertificateExpiration | default false) }} - - alert: KubeClientCertificateExpiration - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: A client certificate used to authenticate to kubernetes apiserver is expiring in less than 24.0 hours. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeclientcertificateexpiration - summary: Client certificate is about to expire. - expr: apiserver_client_certificate_expiration_seconds_count{job="apiserver"} > 0 and on(job) histogram_quantile(0.01, sum by (job, le) (rate(apiserver_client_certificate_expiration_seconds_bucket{job="apiserver"}[5m]))) < 86400 - for: 5m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeAggregatedAPIErrors | default false) }} - - alert: KubeAggregatedAPIErrors - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Kubernetes aggregated API {{`{{`}} $labels.name {{`}}`}}/{{`{{`}} $labels.namespace {{`}}`}} has reported errors. It has appeared unavailable {{`{{`}} $value | humanize {{`}}`}} times averaged over the past 10m. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeaggregatedapierrors - summary: Kubernetes aggregated API has reported errors. - expr: sum by(name, namespace, cluster)(increase(aggregator_unavailable_apiservice_total[10m])) > 4 - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeAggregatedAPIDown | default false) }} - - alert: KubeAggregatedAPIDown - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Kubernetes aggregated API {{`{{`}} $labels.name {{`}}`}}/{{`{{`}} $labels.namespace {{`}}`}} has been only {{`{{`}} $value | humanize {{`}}`}}% available over the last 10m. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeaggregatedapidown - summary: Kubernetes aggregated API is down. - expr: (1 - max by(name, namespace, cluster)(avg_over_time(aggregator_unavailable_apiservice[10m]))) * 100 < 85 - for: 5m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if .Values.kubeApiServer.enabled }} -{{- if not (.Values.defaultRules.disabled.KubeAPIDown | default false) }} - - alert: KubeAPIDown - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: KubeAPI has disappeared from Prometheus target discovery. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeapidown - summary: Target disappeared from Prometheus target discovery. - expr: absent(up{job="apiserver"} == 1) - for: 15m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeAPITerminatedRequests | default false) }} - - alert: KubeAPITerminatedRequests - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: The kubernetes apiserver has terminated {{`{{`}} $value | humanizePercentage {{`}}`}} of its incoming requests. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeapiterminatedrequests - summary: The kubernetes apiserver has terminated {{`{{`}} $value | humanizePercentage {{`}}`}} of its incoming requests. - expr: sum(rate(apiserver_request_terminations_total{job="apiserver"}[10m])) / ( sum(rate(apiserver_request_total{job="apiserver"}[10m])) + sum(rate(apiserver_request_terminations_total{job="apiserver"}[10m])) ) > 0.20 - for: 5m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-controller-manager.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-controller-manager.yaml deleted file mode 100644 index dded48dee6..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-controller-manager.yaml +++ /dev/null @@ -1,47 +0,0 @@ -{{- /* -Generated from 'kubernetes-system-controller-manager' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubernetesControlPlane-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.kubeControllerManager }} -{{- if (include "exporter.kubeControllerManager.enabled" .)}} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "kubernetes-system-controller-manager" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: kubernetes-system-controller-manager - rules: -{{- if not (.Values.defaultRules.disabled.KubeControllerManagerDown | default false) }} - - alert: KubeControllerManagerDown - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: KubeControllerManager has disappeared from Prometheus target discovery. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubecontrollermanagerdown - summary: Target disappeared from Prometheus target discovery. - expr: absent(up{job="{{ include "exporter.kubeControllerManager.jobName" . }}"} == 1) - for: 15m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} -{{- end }} - diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-kube-proxy.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-kube-proxy.yaml deleted file mode 100644 index 9b64455677..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-kube-proxy.yaml +++ /dev/null @@ -1,46 +0,0 @@ -{{- /* -Generated from 'kubernetes-system-kube-proxy' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubernetesControlPlane-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.kubeProxy }} -{{- if (include "exporter.kubeProxy.enabled" .)}} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "kubernetes-system-kube-proxy" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: kubernetes-system-kube-proxy - rules: -{{- if not (.Values.defaultRules.disabled.KubeProxyDown | default false) }} - - alert: KubeProxyDown - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: KubeProxy has disappeared from Prometheus target discovery. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeproxydown - summary: Target disappeared from Prometheus target discovery. - expr: absent(up{job="{{ include "exporter.kubeProxy.jobName" . }}"} == 1) - for: 15m - labels: - severity: critical -{{- if .Values.defaultRules.additionalRuleLabels }} -{{ toYaml .Values.defaultRules.additionalRuleLabels | indent 8 }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-kubelet.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-kubelet.yaml deleted file mode 100644 index 18ee2dc74b..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-kubelet.yaml +++ /dev/null @@ -1,253 +0,0 @@ -{{- /* -Generated from 'kubernetes-system-kubelet' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubernetesControlPlane-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.kubernetesSystem }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "kubernetes-system-kubelet" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: kubernetes-system-kubelet - rules: -{{- if not (.Values.defaultRules.disabled.KubeNodeNotReady | default false) }} - - alert: KubeNodeNotReady - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: '{{`{{`}} $labels.node {{`}}`}} has been unready for more than 15 minutes.' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubenodenotready - summary: Node is not ready. - expr: kube_node_status_condition{job="kube-state-metrics",condition="Ready",status="true"} == 0 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeNodeUnreachable | default false) }} - - alert: KubeNodeUnreachable - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: '{{`{{`}} $labels.node {{`}}`}} is unreachable and some workloads may be rescheduled.' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubenodeunreachable - summary: Node is unreachable. - expr: (kube_node_spec_taint{job="kube-state-metrics",key="node.kubernetes.io/unreachable",effect="NoSchedule"} unless ignoring(key,value) kube_node_spec_taint{job="kube-state-metrics",key=~"ToBeDeletedByClusterAutoscaler|cloud.google.com/impending-node-termination|aws-node-termination-handler/spot-itn"}) == 1 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeletTooManyPods | default false) }} - - alert: KubeletTooManyPods - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Kubelet '{{`{{`}} $labels.node {{`}}`}}' is running at {{`{{`}} $value | humanizePercentage {{`}}`}} of its Pod capacity. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubelettoomanypods - summary: Kubelet is running at capacity. - expr: |- - count by(cluster, node) ( - (kube_pod_status_phase{job="kube-state-metrics",phase="Running"} == 1) * on(instance,pod,namespace,cluster) group_left(node) topk by(instance,pod,namespace,cluster) (1, kube_pod_info{job="kube-state-metrics"}) - ) - / - max by(cluster, node) ( - kube_node_status_capacity{job="kube-state-metrics",resource="pods"} != 1 - ) > 0.95 - for: 15m - labels: - severity: info - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeNodeReadinessFlapping | default false) }} - - alert: KubeNodeReadinessFlapping - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: The readiness status of node {{`{{`}} $labels.node {{`}}`}} has changed {{`{{`}} $value {{`}}`}} times in the last 15 minutes. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubenodereadinessflapping - summary: Node readiness status is flapping. - expr: sum(changes(kube_node_status_condition{job="kube-state-metrics",status="true",condition="Ready"}[15m])) by (cluster, node) > 2 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeletPlegDurationHigh | default false) }} - - alert: KubeletPlegDurationHigh - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: The Kubelet Pod Lifecycle Event Generator has a 99th percentile duration of {{`{{`}} $value {{`}}`}} seconds on node {{`{{`}} $labels.node {{`}}`}}. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeletplegdurationhigh - summary: Kubelet Pod Lifecycle Event Generator is taking too long to relist. - expr: node_quantile:kubelet_pleg_relist_duration_seconds:histogram_quantile{quantile="0.99"} >= 10 - for: 5m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeletPodStartUpLatencyHigh | default false) }} - - alert: KubeletPodStartUpLatencyHigh - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Kubelet Pod startup 99th percentile latency is {{`{{`}} $value {{`}}`}} seconds on node {{`{{`}} $labels.node {{`}}`}}. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeletpodstartuplatencyhigh - summary: Kubelet Pod startup latency is too high. - expr: histogram_quantile(0.99, sum(rate(kubelet_pod_worker_duration_seconds_bucket{job="{{ include "exporter.kubelet.jobName" . }}", metrics_path="/metrics"}[5m])) by (cluster, instance, le)) * on(cluster, instance) group_left(node) kubelet_node_name{job="{{ include "exporter.kubelet.jobName" . }}", metrics_path="/metrics"} > 60 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeletClientCertificateExpiration | default false) }} - - alert: KubeletClientCertificateExpiration - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Client certificate for Kubelet on node {{`{{`}} $labels.node {{`}}`}} expires in {{`{{`}} $value | humanizeDuration {{`}}`}}. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeletclientcertificateexpiration - summary: Kubelet client certificate is about to expire. - expr: kubelet_certificate_manager_client_ttl_seconds < 604800 - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeletClientCertificateExpiration | default false) }} - - alert: KubeletClientCertificateExpiration - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Client certificate for Kubelet on node {{`{{`}} $labels.node {{`}}`}} expires in {{`{{`}} $value | humanizeDuration {{`}}`}}. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeletclientcertificateexpiration - summary: Kubelet client certificate is about to expire. - expr: kubelet_certificate_manager_client_ttl_seconds < 86400 - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeletServerCertificateExpiration | default false) }} - - alert: KubeletServerCertificateExpiration - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Server certificate for Kubelet on node {{`{{`}} $labels.node {{`}}`}} expires in {{`{{`}} $value | humanizeDuration {{`}}`}}. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeletservercertificateexpiration - summary: Kubelet server certificate is about to expire. - expr: kubelet_certificate_manager_server_ttl_seconds < 604800 - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeletServerCertificateExpiration | default false) }} - - alert: KubeletServerCertificateExpiration - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Server certificate for Kubelet on node {{`{{`}} $labels.node {{`}}`}} expires in {{`{{`}} $value | humanizeDuration {{`}}`}}. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeletservercertificateexpiration - summary: Kubelet server certificate is about to expire. - expr: kubelet_certificate_manager_server_ttl_seconds < 86400 - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeletClientCertificateRenewalErrors | default false) }} - - alert: KubeletClientCertificateRenewalErrors - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Kubelet on node {{`{{`}} $labels.node {{`}}`}} has failed to renew its client certificate ({{`{{`}} $value | humanize {{`}}`}} errors in the last 5 minutes). - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeletclientcertificaterenewalerrors - summary: Kubelet has failed to renew its client certificate. - expr: increase(kubelet_certificate_manager_client_expiration_renew_errors[5m]) > 0 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeletServerCertificateRenewalErrors | default false) }} - - alert: KubeletServerCertificateRenewalErrors - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Kubelet on node {{`{{`}} $labels.node {{`}}`}} has failed to renew its server certificate ({{`{{`}} $value | humanize {{`}}`}} errors in the last 5 minutes). - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeletservercertificaterenewalerrors - summary: Kubelet has failed to renew its server certificate. - expr: increase(kubelet_server_expiration_renew_errors[5m]) > 0 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if (include "exporter.kubelet.enabled" .)}} -{{- if not (.Values.defaultRules.disabled.KubeletDown | default false) }} - - alert: KubeletDown - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Kubelet has disappeared from Prometheus target discovery. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeletdown - summary: Target disappeared from Prometheus target discovery. - expr: absent(up{job="{{ include "exporter.kubelet.jobName" . }}", metrics_path="/metrics"} == 1) - for: 15m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-scheduler.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-scheduler.yaml deleted file mode 100644 index e970d8756d..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system-scheduler.yaml +++ /dev/null @@ -1,46 +0,0 @@ -{{- /* -Generated from 'kubernetes-system-scheduler' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubernetesControlPlane-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.kubeScheduler.enabled .Values.defaultRules.rules.kubeSchedulerAlerting }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "kubernetes-system-scheduler" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: kubernetes-system-scheduler - rules: -{{- if .Values.kubeScheduler.enabled }} -{{- if not (.Values.defaultRules.disabled.KubeSchedulerDown | default false) }} - - alert: KubeSchedulerDown - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: KubeScheduler has disappeared from Prometheus target discovery. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeschedulerdown - summary: Target disappeared from Prometheus target discovery. - expr: absent(up{job="{{ include "exporter.kubeScheduler.jobName" . }}"} == 1) - for: 15m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system.yaml deleted file mode 100644 index 08e4ec5c69..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/kubernetes-system.yaml +++ /dev/null @@ -1,65 +0,0 @@ -{{- /* -Generated from 'kubernetes-system' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubernetesControlPlane-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.kubernetesSystem }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "kubernetes-system" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: kubernetes-system - rules: -{{- if not (.Values.defaultRules.disabled.KubeVersionMismatch | default false) }} - - alert: KubeVersionMismatch - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: There are {{`{{`}} $value {{`}}`}} different semantic versions of Kubernetes components running. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeversionmismatch - summary: Different semantic versions of Kubernetes components running. - expr: count by (cluster) (count by (git_version, cluster) (label_replace(kubernetes_build_info{job!~"kube-dns|coredns"},"git_version","$1","git_version","(v[0-9]*.[0-9]*).*"))) > 1 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.KubeClientErrors | default false) }} - - alert: KubeClientErrors - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Kubernetes API server client '{{`{{`}} $labels.job {{`}}`}}/{{`{{`}} $labels.instance {{`}}`}}' is experiencing {{`{{`}} $value | humanizePercentage {{`}}`}} errors.' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubeclienterrors - summary: Kubernetes API server client is experiencing errors. - expr: |- - (sum(rate(rest_client_requests_total{job="apiserver",code=~"5.."}[5m])) by (cluster, instance, job, namespace) - / - sum(rate(rest_client_requests_total{job="apiserver"}[5m])) by (cluster, instance, job, namespace)) - > 0.01 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/node-exporter.rules.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/node-exporter.rules.yaml deleted file mode 100644 index 57324b8e59..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/node-exporter.rules.yaml +++ /dev/null @@ -1,133 +0,0 @@ -{{- /* -Generated from 'node-exporter.rules' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/nodeExporter-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.nodeExporterRecording }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "node-exporter.rules" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: node-exporter.rules - rules: - - expr: |- - count without (cpu, mode) ( - node_cpu_seconds_total{job="node-exporter",mode="idle"} - ) - record: instance:node_num_cpu:sum - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - 1 - avg without (cpu) ( - sum without (mode) (rate(node_cpu_seconds_total{job="node-exporter", mode=~"idle|iowait|steal"}[5m])) - ) - record: instance:node_cpu_utilisation:rate5m - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - ( - node_load1{job="node-exporter"} - / - instance:node_num_cpu:sum{job="node-exporter"} - ) - record: instance:node_load1_per_cpu:ratio - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - 1 - ( - ( - node_memory_MemAvailable_bytes{job="node-exporter"} - or - ( - node_memory_Buffers_bytes{job="node-exporter"} - + - node_memory_Cached_bytes{job="node-exporter"} - + - node_memory_MemFree_bytes{job="node-exporter"} - + - node_memory_Slab_bytes{job="node-exporter"} - ) - ) - / - node_memory_MemTotal_bytes{job="node-exporter"} - ) - record: instance:node_memory_utilisation:ratio - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: rate(node_vmstat_pgmajfault{job="node-exporter"}[5m]) - record: instance:node_vmstat_pgmajfault:rate5m - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: rate(node_disk_io_time_seconds_total{job="node-exporter", device=~"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)"}[5m]) - record: instance_device:node_disk_io_time_seconds:rate5m - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: rate(node_disk_io_time_weighted_seconds_total{job="node-exporter", device=~"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)"}[5m]) - record: instance_device:node_disk_io_time_weighted_seconds:rate5m - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - sum without (device) ( - rate(node_network_receive_bytes_total{job="node-exporter", device!="lo"}[5m]) - ) - record: instance:node_network_receive_bytes_excluding_lo:rate5m - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - sum without (device) ( - rate(node_network_transmit_bytes_total{job="node-exporter", device!="lo"}[5m]) - ) - record: instance:node_network_transmit_bytes_excluding_lo:rate5m - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - sum without (device) ( - rate(node_network_receive_drop_total{job="node-exporter", device!="lo"}[5m]) - ) - record: instance:node_network_receive_drop_excluding_lo:rate5m - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - sum without (device) ( - rate(node_network_transmit_drop_total{job="node-exporter", device!="lo"}[5m]) - ) - record: instance:node_network_transmit_drop_excluding_lo:rate5m - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/node-exporter.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/node-exporter.yaml deleted file mode 100644 index 01205ba2fb..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/node-exporter.yaml +++ /dev/null @@ -1,398 +0,0 @@ -{{- /* -Generated from 'node-exporter' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/nodeExporter-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.nodeExporterAlerting }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "node-exporter" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: node-exporter - rules: -{{- if not (.Values.defaultRules.disabled.NodeFilesystemSpaceFillingUp | default false) }} - - alert: NodeFilesystemSpaceFillingUp - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Filesystem on {{`{{`}} $labels.device {{`}}`}} at {{`{{`}} $labels.instance {{`}}`}} has only {{`{{`}} printf "%.2f" $value {{`}}`}}% available space left and is filling up. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/node/nodefilesystemspacefillingup - summary: Filesystem is predicted to run out of space within the next 24 hours. - expr: |- - ( - node_filesystem_avail_bytes{job="node-exporter",fstype!="",mountpoint!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!="",mountpoint!=""} * 100 < 15 - and - predict_linear(node_filesystem_avail_bytes{job="node-exporter",fstype!="",mountpoint!=""}[6h], 24*60*60) < 0 - and - node_filesystem_readonly{job="node-exporter",fstype!="",mountpoint!=""} == 0 - ) - for: 1h - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.NodeFilesystemSpaceFillingUp | default false) }} - - alert: NodeFilesystemSpaceFillingUp - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Filesystem on {{`{{`}} $labels.device {{`}}`}} at {{`{{`}} $labels.instance {{`}}`}} has only {{`{{`}} printf "%.2f" $value {{`}}`}}% available space left and is filling up fast. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/node/nodefilesystemspacefillingup - summary: Filesystem is predicted to run out of space within the next 4 hours. - expr: |- - ( - node_filesystem_avail_bytes{job="node-exporter",fstype!="",mountpoint!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!="",mountpoint!=""} * 100 < 10 - and - predict_linear(node_filesystem_avail_bytes{job="node-exporter",fstype!="",mountpoint!=""}[6h], 4*60*60) < 0 - and - node_filesystem_readonly{job="node-exporter",fstype!="",mountpoint!=""} == 0 - ) - for: 1h - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.NodeFilesystemAlmostOutOfSpace | default false) }} - - alert: NodeFilesystemAlmostOutOfSpace - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Filesystem on {{`{{`}} $labels.device {{`}}`}} at {{`{{`}} $labels.instance {{`}}`}} has only {{`{{`}} printf "%.2f" $value {{`}}`}}% available space left. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/node/nodefilesystemalmostoutofspace - summary: Filesystem has less than 5% space left. - expr: |- - ( - node_filesystem_avail_bytes{job="node-exporter",fstype!="",mountpoint!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!="",mountpoint!=""} * 100 < 5 - and - node_filesystem_readonly{job="node-exporter",fstype!="",mountpoint!=""} == 0 - ) - for: 30m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.NodeFilesystemAlmostOutOfSpace | default false) }} - - alert: NodeFilesystemAlmostOutOfSpace - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Filesystem on {{`{{`}} $labels.device {{`}}`}} at {{`{{`}} $labels.instance {{`}}`}} has only {{`{{`}} printf "%.2f" $value {{`}}`}}% available space left. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/node/nodefilesystemalmostoutofspace - summary: Filesystem has less than 3% space left. - expr: |- - ( - node_filesystem_avail_bytes{job="node-exporter",fstype!="",mountpoint!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!="",mountpoint!=""} * 100 < 3 - and - node_filesystem_readonly{job="node-exporter",fstype!="",mountpoint!=""} == 0 - ) - for: 30m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.NodeFilesystemFilesFillingUp | default false) }} - - alert: NodeFilesystemFilesFillingUp - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Filesystem on {{`{{`}} $labels.device {{`}}`}} at {{`{{`}} $labels.instance {{`}}`}} has only {{`{{`}} printf "%.2f" $value {{`}}`}}% available inodes left and is filling up. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/node/nodefilesystemfilesfillingup - summary: Filesystem is predicted to run out of inodes within the next 24 hours. - expr: |- - ( - node_filesystem_files_free{job="node-exporter",fstype!="",mountpoint!=""} / node_filesystem_files{job="node-exporter",fstype!="",mountpoint!=""} * 100 < 40 - and - predict_linear(node_filesystem_files_free{job="node-exporter",fstype!="",mountpoint!=""}[6h], 24*60*60) < 0 - and - node_filesystem_readonly{job="node-exporter",fstype!="",mountpoint!=""} == 0 - ) - for: 1h - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.NodeFilesystemFilesFillingUp | default false) }} - - alert: NodeFilesystemFilesFillingUp - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Filesystem on {{`{{`}} $labels.device {{`}}`}} at {{`{{`}} $labels.instance {{`}}`}} has only {{`{{`}} printf "%.2f" $value {{`}}`}}% available inodes left and is filling up fast. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/node/nodefilesystemfilesfillingup - summary: Filesystem is predicted to run out of inodes within the next 4 hours. - expr: |- - ( - node_filesystem_files_free{job="node-exporter",fstype!="",mountpoint!=""} / node_filesystem_files{job="node-exporter",fstype!="",mountpoint!=""} * 100 < 20 - and - predict_linear(node_filesystem_files_free{job="node-exporter",fstype!="",mountpoint!=""}[6h], 4*60*60) < 0 - and - node_filesystem_readonly{job="node-exporter",fstype!="",mountpoint!=""} == 0 - ) - for: 1h - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.NodeFilesystemAlmostOutOfFiles | default false) }} - - alert: NodeFilesystemAlmostOutOfFiles - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Filesystem on {{`{{`}} $labels.device {{`}}`}} at {{`{{`}} $labels.instance {{`}}`}} has only {{`{{`}} printf "%.2f" $value {{`}}`}}% available inodes left. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/node/nodefilesystemalmostoutoffiles - summary: Filesystem has less than 5% inodes left. - expr: |- - ( - node_filesystem_files_free{job="node-exporter",fstype!="",mountpoint!=""} / node_filesystem_files{job="node-exporter",fstype!="",mountpoint!=""} * 100 < 5 - and - node_filesystem_readonly{job="node-exporter",fstype!="",mountpoint!=""} == 0 - ) - for: 1h - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.NodeFilesystemAlmostOutOfFiles | default false) }} - - alert: NodeFilesystemAlmostOutOfFiles - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Filesystem on {{`{{`}} $labels.device {{`}}`}} at {{`{{`}} $labels.instance {{`}}`}} has only {{`{{`}} printf "%.2f" $value {{`}}`}}% available inodes left. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/node/nodefilesystemalmostoutoffiles - summary: Filesystem has less than 3% inodes left. - expr: |- - ( - node_filesystem_files_free{job="node-exporter",fstype!="",mountpoint!=""} / node_filesystem_files{job="node-exporter",fstype!="",mountpoint!=""} * 100 < 3 - and - node_filesystem_readonly{job="node-exporter",fstype!="",mountpoint!=""} == 0 - ) - for: 1h - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.NodeNetworkReceiveErrs | default false) }} - - alert: NodeNetworkReceiveErrs - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: '{{`{{`}} $labels.instance {{`}}`}} interface {{`{{`}} $labels.device {{`}}`}} has encountered {{`{{`}} printf "%.0f" $value {{`}}`}} receive errors in the last two minutes.' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/node/nodenetworkreceiveerrs - summary: Network interface is reporting many receive errors. - expr: rate(node_network_receive_errs_total[2m]) / rate(node_network_receive_packets_total[2m]) > 0.01 - for: 1h - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.NodeNetworkTransmitErrs | default false) }} - - alert: NodeNetworkTransmitErrs - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: '{{`{{`}} $labels.instance {{`}}`}} interface {{`{{`}} $labels.device {{`}}`}} has encountered {{`{{`}} printf "%.0f" $value {{`}}`}} transmit errors in the last two minutes.' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/node/nodenetworktransmiterrs - summary: Network interface is reporting many transmit errors. - expr: rate(node_network_transmit_errs_total[2m]) / rate(node_network_transmit_packets_total[2m]) > 0.01 - for: 1h - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.NodeHighNumberConntrackEntriesUsed | default false) }} - - alert: NodeHighNumberConntrackEntriesUsed - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: '{{`{{`}} $value | humanizePercentage {{`}}`}} of conntrack entries are used.' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/node/nodehighnumberconntrackentriesused - summary: Number of conntrack are getting close to the limit. - expr: (node_nf_conntrack_entries / node_nf_conntrack_entries_limit) > 0.75 - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.NodeTextFileCollectorScrapeError | default false) }} - - alert: NodeTextFileCollectorScrapeError - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Node Exporter text file collector failed to scrape. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/node/nodetextfilecollectorscrapeerror - summary: Node Exporter text file collector failed to scrape. - expr: node_textfile_scrape_error{job="node-exporter"} == 1 - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.NodeClockSkewDetected | default false) }} - - alert: NodeClockSkewDetected - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Clock on {{`{{`}} $labels.instance {{`}}`}} is out of sync by more than 0.05s. Ensure NTP is configured correctly on this host. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/node/nodeclockskewdetected - summary: Clock skew detected. - expr: |- - ( - node_timex_offset_seconds{job="node-exporter"} > 0.05 - and - deriv(node_timex_offset_seconds{job="node-exporter"}[5m]) >= 0 - ) - or - ( - node_timex_offset_seconds{job="node-exporter"} < -0.05 - and - deriv(node_timex_offset_seconds{job="node-exporter"}[5m]) <= 0 - ) - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.NodeClockNotSynchronising | default false) }} - - alert: NodeClockNotSynchronising - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Clock on {{`{{`}} $labels.instance {{`}}`}} is not synchronising. Ensure NTP is configured on this host. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/node/nodeclocknotsynchronising - summary: Clock not synchronising. - expr: |- - min_over_time(node_timex_sync_status{job="node-exporter"}[5m]) == 0 - and - node_timex_maxerror_seconds{job="node-exporter"} >= 16 - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.NodeRAIDDegraded | default false) }} - - alert: NodeRAIDDegraded - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: RAID array '{{`{{`}} $labels.device {{`}}`}}' on {{`{{`}} $labels.instance {{`}}`}} is in degraded state due to one or more disks failures. Number of spare drives is insufficient to fix issue automatically. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/node/noderaiddegraded - summary: RAID Array is degraded - expr: node_md_disks_required{job="node-exporter",device=~"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)"} - ignoring (state) (node_md_disks{state="active",job="node-exporter",device=~"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)"}) > 0 - for: 15m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.NodeRAIDDiskFailure | default false) }} - - alert: NodeRAIDDiskFailure - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: At least one device in RAID array on {{`{{`}} $labels.instance {{`}}`}} failed. Array '{{`{{`}} $labels.device {{`}}`}}' needs attention and possibly a disk swap. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/node/noderaiddiskfailure - summary: Failed device in RAID array - expr: node_md_disks{state="failed",job="node-exporter",device=~"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)"} > 0 - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.NodeFileDescriptorLimit | default false) }} - - alert: NodeFileDescriptorLimit - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: File descriptors limit at {{`{{`}} $labels.instance {{`}}`}} is currently at {{`{{`}} printf "%.2f" $value {{`}}`}}%. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/node/nodefiledescriptorlimit - summary: Kernel is predicted to exhaust file descriptors limit soon. - expr: |- - ( - node_filefd_allocated{job="node-exporter"} * 100 / node_filefd_maximum{job="node-exporter"} > 70 - ) - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.NodeFileDescriptorLimit | default false) }} - - alert: NodeFileDescriptorLimit - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: File descriptors limit at {{`{{`}} $labels.instance {{`}}`}} is currently at {{`{{`}} printf "%.2f" $value {{`}}`}}%. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/node/nodefiledescriptorlimit - summary: Kernel is predicted to exhaust file descriptors limit soon. - expr: |- - ( - node_filefd_allocated{job="node-exporter"} * 100 / node_filefd_maximum{job="node-exporter"} > 90 - ) - for: 15m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/node-network.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/node-network.yaml deleted file mode 100644 index 5d8ddffbd8..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/node-network.yaml +++ /dev/null @@ -1,44 +0,0 @@ -{{- /* -Generated from 'node-network' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubePrometheus-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.network }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "node-network" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: node-network - rules: -{{- if not (.Values.defaultRules.disabled.NodeNetworkInterfaceFlapping | default false) }} - - alert: NodeNetworkInterfaceFlapping - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Network interface "{{`{{`}} $labels.device {{`}}`}}" changing its up status often on node-exporter {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.pod {{`}}`}} - runbook_url: {{ .Values.defaultRules.runbookUrl }}/general/nodenetworkinterfaceflapping - summary: Network interface is often changing its status - expr: changes(node_network_up{job="node-exporter",device!~"veth.+"}[2m]) > 2 - for: 2m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/node.rules.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/node.rules.yaml deleted file mode 100644 index 3cfaf519ed..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/node.rules.yaml +++ /dev/null @@ -1,83 +0,0 @@ -{{- /* -Generated from 'node.rules' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/kubernetesControlPlane-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.node }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "node.rules" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: node.rules - rules: - - expr: |- - topk by(cluster, namespace, pod) (1, - max by (cluster, node, namespace, pod) ( - label_replace(kube_pod_info{job="kube-state-metrics",node!=""}, "pod", "$1", "pod", "(.*)") - )) - record: 'node_namespace_pod:kube_pod_info:' - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - count by (cluster, node) ( - node_cpu_seconds_total{mode="idle",job="node-exporter"} - * on (namespace, pod) group_left(node) - topk by(namespace, pod) (1, node_namespace_pod:kube_pod_info:) - ) - record: node:node_num_cpu:sum - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - sum( - node_memory_MemAvailable_bytes{job="node-exporter"} or - ( - node_memory_Buffers_bytes{job="node-exporter"} + - node_memory_Cached_bytes{job="node-exporter"} + - node_memory_MemFree_bytes{job="node-exporter"} + - node_memory_Slab_bytes{job="node-exporter"} - ) - ) by (cluster) - record: :node_memory_MemAvailable_bytes:sum - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - avg by (cluster, node) ( - sum without (mode) ( - rate(node_cpu_seconds_total{mode!="idle",mode!="iowait",mode!="steal",job="node-exporter"}[5m]) - ) - ) - record: node:node_cpu_utilization:ratio_rate5m - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} - - expr: |- - avg by (cluster) ( - node:node_cpu_utilization:ratio_rate5m - ) - record: cluster:node_cpu:ratio_rate5m - {{- if .Values.defaultRules.additionalRuleLabels }} - labels: - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/prometheus-operator.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/prometheus-operator.yaml deleted file mode 100644 index 242cc1f8a3..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/prometheus-operator.yaml +++ /dev/null @@ -1,148 +0,0 @@ -{{- /* -Generated from 'prometheus-operator' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/prometheusOperator-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.prometheusOperator }} -{{- $operatorJob := printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "operator" }} -{{- $namespace := printf "%s" (include "kube-prometheus-stack.namespace" .) }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "prometheus-operator" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: prometheus-operator - rules: -{{- if not (.Values.defaultRules.disabled.PrometheusOperatorListErrors | default false) }} - - alert: PrometheusOperatorListErrors - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Errors while performing List operations in controller {{`{{`}}$labels.controller{{`}}`}} in {{`{{`}}$labels.namespace{{`}}`}} namespace. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus-operator/prometheusoperatorlisterrors - summary: Errors while performing list operations in controller. - expr: (sum by (controller,namespace,cluster) (rate(prometheus_operator_list_operations_failed_total{job="{{ $operatorJob }}",namespace="{{ $namespace }}"}[10m])) / sum by (controller,namespace,cluster) (rate(prometheus_operator_list_operations_total{job="{{ $operatorJob }}",namespace="{{ $namespace }}"}[10m]))) > 0.4 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusOperatorWatchErrors | default false) }} - - alert: PrometheusOperatorWatchErrors - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Errors while performing watch operations in controller {{`{{`}}$labels.controller{{`}}`}} in {{`{{`}}$labels.namespace{{`}}`}} namespace. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus-operator/prometheusoperatorwatcherrors - summary: Errors while performing watch operations in controller. - expr: (sum by (controller,namespace,cluster) (rate(prometheus_operator_watch_operations_failed_total{job="{{ $operatorJob }}",namespace="{{ $namespace }}"}[5m])) / sum by (controller,namespace,cluster) (rate(prometheus_operator_watch_operations_total{job="{{ $operatorJob }}",namespace="{{ $namespace }}"}[5m]))) > 0.4 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusOperatorSyncFailed | default false) }} - - alert: PrometheusOperatorSyncFailed - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Controller {{`{{`}} $labels.controller {{`}}`}} in {{`{{`}} $labels.namespace {{`}}`}} namespace fails to reconcile {{`{{`}} $value {{`}}`}} objects. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus-operator/prometheusoperatorsyncfailed - summary: Last controller reconciliation failed - expr: min_over_time(prometheus_operator_syncs{status="failed",job="{{ $operatorJob }}",namespace="{{ $namespace }}"}[5m]) > 0 - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusOperatorReconcileErrors | default false) }} - - alert: PrometheusOperatorReconcileErrors - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: '{{`{{`}} $value | humanizePercentage {{`}}`}} of reconciling operations failed for {{`{{`}} $labels.controller {{`}}`}} controller in {{`{{`}} $labels.namespace {{`}}`}} namespace.' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus-operator/prometheusoperatorreconcileerrors - summary: Errors while reconciling controller. - expr: (sum by (controller,namespace,cluster) (rate(prometheus_operator_reconcile_errors_total{job="{{ $operatorJob }}",namespace="{{ $namespace }}"}[5m]))) / (sum by (controller,namespace,cluster) (rate(prometheus_operator_reconcile_operations_total{job="{{ $operatorJob }}",namespace="{{ $namespace }}"}[5m]))) > 0.1 - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusOperatorNodeLookupErrors | default false) }} - - alert: PrometheusOperatorNodeLookupErrors - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Errors while reconciling Prometheus in {{`{{`}} $labels.namespace {{`}}`}} Namespace. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus-operator/prometheusoperatornodelookuperrors - summary: Errors while reconciling Prometheus. - expr: rate(prometheus_operator_node_address_lookup_errors_total{job="{{ $operatorJob }}",namespace="{{ $namespace }}"}[5m]) > 0.1 - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusOperatorNotReady | default false) }} - - alert: PrometheusOperatorNotReady - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus operator in {{`{{`}} $labels.namespace {{`}}`}} namespace isn't ready to reconcile {{`{{`}} $labels.controller {{`}}`}} resources. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus-operator/prometheusoperatornotready - summary: Prometheus operator not ready - expr: min by (controller,namespace,cluster) (max_over_time(prometheus_operator_ready{job="{{ $operatorJob }}",namespace="{{ $namespace }}"}[5m]) == 0) - for: 5m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusOperatorRejectedResources | default false) }} - - alert: PrometheusOperatorRejectedResources - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus operator in {{`{{`}} $labels.namespace {{`}}`}} namespace rejected {{`{{`}} printf "%0.0f" $value {{`}}`}} {{`{{`}} $labels.controller {{`}}`}}/{{`{{`}} $labels.resource {{`}}`}} resources. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus-operator/prometheusoperatorrejectedresources - summary: Resources rejected by Prometheus operator - expr: min_over_time(prometheus_operator_managed_resources{state="rejected",job="{{ $operatorJob }}",namespace="{{ $namespace }}"}[5m]) > 0 - for: 5m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/prometheus.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/prometheus.yaml deleted file mode 100644 index 9180c94f53..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/rules-1.14/prometheus.yaml +++ /dev/null @@ -1,448 +0,0 @@ -{{- /* -Generated from 'prometheus' group from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/prometheus-prometheusRule.yaml -Do not change in-place! In order to change this file first read following link: -https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/hack -*/ -}} -{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} -{{- if and (semverCompare ">=1.14.0-0" $kubeTargetVersion) (semverCompare "<9.9.9-9" $kubeTargetVersion) .Values.defaultRules.create .Values.defaultRules.rules.prometheus }} -{{- $prometheusJob := printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "prometheus" }} -{{- $namespace := printf "%s" (include "kube-prometheus-stack.namespace" .) }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "prometheus" | trunc 63 | trimSuffix "-" }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.defaultRules.labels }} -{{ toYaml .Values.defaultRules.labels | indent 4 }} -{{- end }} -{{- if .Values.defaultRules.annotations }} - annotations: -{{ toYaml .Values.defaultRules.annotations | indent 4 }} -{{- end }} -spec: - groups: - - name: prometheus - rules: -{{- if not (.Values.defaultRules.disabled.PrometheusBadConfig | default false) }} - - alert: PrometheusBadConfig - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} has failed to reload its configuration. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheusbadconfig - summary: Failed Prometheus configuration reload. - expr: |- - # Without max_over_time, failed scrapes could create false negatives, see - # https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details. - max_over_time(prometheus_config_last_reload_successful{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) == 0 - for: 10m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusNotificationQueueRunningFull | default false) }} - - alert: PrometheusNotificationQueueRunningFull - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Alert notification queue of Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} is running full. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheusnotificationqueuerunningfull - summary: Prometheus alert notification queue predicted to run full in less than 30m. - expr: |- - # Without min_over_time, failed scrapes could create false negatives, see - # https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details. - ( - predict_linear(prometheus_notifications_queue_length{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m], 60 * 30) - > - min_over_time(prometheus_notifications_queue_capacity{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) - ) - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusErrorSendingAlertsToSomeAlertmanagers | default false) }} - - alert: PrometheusErrorSendingAlertsToSomeAlertmanagers - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: '{{`{{`}} printf "%.1f" $value {{`}}`}}% errors while sending alerts from Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} to Alertmanager {{`{{`}}$labels.alertmanager{{`}}`}}.' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheuserrorsendingalertstosomealertmanagers - summary: Prometheus has encountered more than 1% errors sending alerts to a specific Alertmanager. - expr: |- - ( - rate(prometheus_notifications_errors_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) - / - rate(prometheus_notifications_sent_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) - ) - * 100 - > 1 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusNotConnectedToAlertmanagers | default false) }} - - alert: PrometheusNotConnectedToAlertmanagers - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} is not connected to any Alertmanagers. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheusnotconnectedtoalertmanagers - summary: Prometheus is not connected to any Alertmanagers. - expr: |- - # Without max_over_time, failed scrapes could create false negatives, see - # https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details. - max_over_time(prometheus_notifications_alertmanagers_discovered{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) < 1 - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusTSDBReloadsFailing | default false) }} - - alert: PrometheusTSDBReloadsFailing - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} has detected {{`{{`}}$value | humanize{{`}}`}} reload failures over the last 3h. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheustsdbreloadsfailing - summary: Prometheus has issues reloading blocks from disk. - expr: increase(prometheus_tsdb_reloads_failures_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[3h]) > 0 - for: 4h - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusTSDBCompactionsFailing | default false) }} - - alert: PrometheusTSDBCompactionsFailing - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} has detected {{`{{`}}$value | humanize{{`}}`}} compaction failures over the last 3h. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheustsdbcompactionsfailing - summary: Prometheus has issues compacting blocks. - expr: increase(prometheus_tsdb_compactions_failed_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[3h]) > 0 - for: 4h - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusNotIngestingSamples | default false) }} - - alert: PrometheusNotIngestingSamples - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} is not ingesting samples. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheusnotingestingsamples - summary: Prometheus is not ingesting samples. - expr: |- - ( - rate(prometheus_tsdb_head_samples_appended_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) <= 0 - and - ( - sum without(scrape_job) (prometheus_target_metadata_cache_entries{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}) > 0 - or - sum without(rule_group) (prometheus_rule_group_rules{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}) > 0 - ) - ) - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusDuplicateTimestamps | default false) }} - - alert: PrometheusDuplicateTimestamps - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} is dropping {{`{{`}} printf "%.4g" $value {{`}}`}} samples/s with different values but duplicated timestamp. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheusduplicatetimestamps - summary: Prometheus is dropping samples with duplicate timestamps. - expr: rate(prometheus_target_scrapes_sample_duplicate_timestamp_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) > 0 - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusOutOfOrderTimestamps | default false) }} - - alert: PrometheusOutOfOrderTimestamps - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} is dropping {{`{{`}} printf "%.4g" $value {{`}}`}} samples/s with timestamps arriving out of order. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheusoutofordertimestamps - summary: Prometheus drops samples with out-of-order timestamps. - expr: rate(prometheus_target_scrapes_sample_out_of_order_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) > 0 - for: 10m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusRemoteStorageFailures | default false) }} - - alert: PrometheusRemoteStorageFailures - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} failed to send {{`{{`}} printf "%.1f" $value {{`}}`}}% of the samples to {{`{{`}} $labels.remote_name{{`}}`}}:{{`{{`}} $labels.url {{`}}`}} - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheusremotestoragefailures - summary: Prometheus fails to send samples to remote storage. - expr: |- - ( - (rate(prometheus_remote_storage_failed_samples_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) or rate(prometheus_remote_storage_samples_failed_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m])) - / - ( - (rate(prometheus_remote_storage_failed_samples_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) or rate(prometheus_remote_storage_samples_failed_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m])) - + - (rate(prometheus_remote_storage_succeeded_samples_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) or rate(prometheus_remote_storage_samples_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m])) - ) - ) - * 100 - > 1 - for: 15m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusRemoteWriteBehind | default false) }} - - alert: PrometheusRemoteWriteBehind - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} remote write is {{`{{`}} printf "%.1f" $value {{`}}`}}s behind for {{`{{`}} $labels.remote_name{{`}}`}}:{{`{{`}} $labels.url {{`}}`}}. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheusremotewritebehind - summary: Prometheus remote write is behind. - expr: |- - # Without max_over_time, failed scrapes could create false negatives, see - # https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details. - ( - max_over_time(prometheus_remote_storage_highest_timestamp_in_seconds{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) - - ignoring(remote_name, url) group_right - max_over_time(prometheus_remote_storage_queue_highest_sent_timestamp_seconds{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) - ) - > 120 - for: 15m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusRemoteWriteDesiredShards | default false) }} - - alert: PrometheusRemoteWriteDesiredShards - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} remote write desired shards calculation wants to run {{`{{`}} $value {{`}}`}} shards for queue {{`{{`}} $labels.remote_name{{`}}`}}:{{`{{`}} $labels.url {{`}}`}}, which is more than the max of {{`{{`}} printf `prometheus_remote_storage_shards_max{instance="%s",job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}` $labels.instance | query | first | value {{`}}`}}. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheusremotewritedesiredshards - summary: Prometheus remote write desired shards calculation wants to run more than configured max shards. - expr: |- - # Without max_over_time, failed scrapes could create false negatives, see - # https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details. - ( - max_over_time(prometheus_remote_storage_shards_desired{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) - > - max_over_time(prometheus_remote_storage_shards_max{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) - ) - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusRuleFailures | default false) }} - - alert: PrometheusRuleFailures - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} has failed to evaluate {{`{{`}} printf "%.0f" $value {{`}}`}} rules in the last 5m. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheusrulefailures - summary: Prometheus is failing rule evaluations. - expr: increase(prometheus_rule_evaluation_failures_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) > 0 - for: 15m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusMissingRuleEvaluations | default false) }} - - alert: PrometheusMissingRuleEvaluations - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} has missed {{`{{`}} printf "%.0f" $value {{`}}`}} rule group evaluations in the last 5m. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheusmissingruleevaluations - summary: Prometheus is missing rule evaluations due to slow rule group evaluation. - expr: increase(prometheus_rule_group_iterations_missed_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) > 0 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusTargetLimitHit | default false) }} - - alert: PrometheusTargetLimitHit - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} has dropped {{`{{`}} printf "%.0f" $value {{`}}`}} targets because the number of targets exceeded the configured target_limit. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheustargetlimithit - summary: Prometheus has dropped targets because some scrape configs have exceeded the targets limit. - expr: increase(prometheus_target_scrape_pool_exceeded_target_limit_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) > 0 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusLabelLimitHit | default false) }} - - alert: PrometheusLabelLimitHit - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} has dropped {{`{{`}} printf "%.0f" $value {{`}}`}} targets because some samples exceeded the configured label_limit, label_name_length_limit or label_value_length_limit. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheuslabellimithit - summary: Prometheus has dropped targets because some scrape configs have exceeded the labels limit. - expr: increase(prometheus_target_scrape_pool_exceeded_label_limits_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) > 0 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusScrapeBodySizeLimitHit | default false) }} - - alert: PrometheusScrapeBodySizeLimitHit - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} has failed {{`{{`}} printf "%.0f" $value {{`}}`}} scrapes in the last 5m because some targets exceeded the configured body_size_limit. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheusscrapebodysizelimithit - summary: Prometheus has dropped some targets that exceeded body size limit. - expr: increase(prometheus_target_scrapes_exceeded_body_size_limit_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) > 0 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusScrapeSampleLimitHit | default false) }} - - alert: PrometheusScrapeSampleLimitHit - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} has failed {{`{{`}} printf "%.0f" $value {{`}}`}} scrapes in the last 5m because some targets exceeded the configured sample_limit. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheusscrapesamplelimithit - summary: Prometheus has failed scrapes that have exceeded the configured sample limit. - expr: increase(prometheus_target_scrapes_exceeded_sample_limit_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) > 0 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusTargetSyncFailure | default false) }} - - alert: PrometheusTargetSyncFailure - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: '{{`{{`}} printf "%.0f" $value {{`}}`}} targets in Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} have failed to sync because invalid configuration was supplied.' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheustargetsyncfailure - summary: Prometheus has failed to sync targets. - expr: increase(prometheus_target_sync_failed_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[30m]) > 0 - for: 5m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusHighQueryLoad | default false) }} - - alert: PrometheusHighQueryLoad - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} query API has less than 20% available capacity in its query engine for the last 15 minutes. - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheushighqueryload - summary: Prometheus is reaching its maximum capacity serving concurrent requests. - expr: avg_over_time(prometheus_engine_queries{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) / max_over_time(prometheus_engine_queries_concurrent_max{job="{{ $prometheusJob }}",namespace="{{ $namespace }}"}[5m]) > 0.8 - for: 15m - labels: - severity: warning - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- if not (.Values.defaultRules.disabled.PrometheusErrorSendingAlertsToAnyAlertmanager | default false) }} - - alert: PrometheusErrorSendingAlertsToAnyAlertmanager - annotations: -{{- if .Values.defaultRules.additionalRuleAnnotations }} -{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }} -{{- end }} - description: '{{`{{`}} printf "%.1f" $value {{`}}`}}% minimum errors while sending alerts from Prometheus {{`{{`}}$labels.namespace{{`}}`}}/{{`{{`}}$labels.pod{{`}}`}} to any Alertmanager.' - runbook_url: {{ .Values.defaultRules.runbookUrl }}/prometheus/prometheuserrorsendingalertstoanyalertmanager - summary: Prometheus encounters more than 3% errors sending alerts to any Alertmanager. - expr: |- - min without (alertmanager) ( - rate(prometheus_notifications_errors_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}",alertmanager!~``}[5m]) - / - rate(prometheus_notifications_sent_total{job="{{ $prometheusJob }}",namespace="{{ $namespace }}",alertmanager!~``}[5m]) - ) - * 100 - > 3 - for: 15m - labels: - severity: critical - {{- if .Values.defaultRules.additionalRuleLabels }} - {{ toYaml .Values.defaultRules.additionalRuleLabels | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/service.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/service.yaml deleted file mode 100644 index 1e1f9c7b7f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/service.yaml +++ /dev/null @@ -1,64 +0,0 @@ -{{- if .Values.prometheus.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus - self-monitor: {{ .Values.prometheus.serviceMonitor.selfMonitor | quote }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.prometheus.service.labels }} -{{ toYaml .Values.prometheus.service.labels | indent 4 }} -{{- end }} -{{- if .Values.prometheus.service.annotations }} - annotations: -{{ toYaml .Values.prometheus.service.annotations | indent 4 }} -{{- end }} -spec: -{{- if .Values.prometheus.service.clusterIP }} - clusterIP: {{ .Values.prometheus.service.clusterIP }} -{{- end }} -{{- if .Values.prometheus.service.externalIPs }} - externalIPs: -{{ toYaml .Values.prometheus.service.externalIPs | indent 4 }} -{{- end }} -{{- if .Values.prometheus.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.prometheus.service.loadBalancerIP }} -{{- end }} -{{- if .Values.prometheus.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- range $cidr := .Values.prometheus.service.loadBalancerSourceRanges }} - - {{ $cidr }} - {{- end }} -{{- end }} -{{- if ne .Values.prometheus.service.type "ClusterIP" }} - externalTrafficPolicy: {{ .Values.prometheus.service.externalTrafficPolicy }} -{{- end }} - ports: - - name: {{ .Values.prometheus.prometheusSpec.portName }} - {{- if eq .Values.prometheus.service.type "NodePort" }} - nodePort: {{ .Values.prometheus.service.nodePort }} - {{- end }} - port: {{ .Values.prometheus.service.port }} - targetPort: {{ .Values.prometheus.service.targetPort }} - {{- if .Values.prometheus.thanosIngress.enabled }} - - name: grpc - {{- if eq .Values.prometheus.service.type "NodePort" }} - nodePort: {{ .Values.prometheus.thanosIngress.nodePort }} - {{- end }} - port: {{ .Values.prometheus.thanosIngress.servicePort }} - targetPort: {{ .Values.prometheus.thanosIngress.servicePort }} - {{- end }} -{{- if .Values.prometheus.service.additionalPorts }} -{{ toYaml .Values.prometheus.service.additionalPorts | indent 2 }} -{{- end }} - publishNotReadyAddresses: {{ .Values.prometheus.service.publishNotReadyAddresses }} - selector: - app.kubernetes.io/name: prometheus - prometheus: {{ template "kube-prometheus-stack.prometheus.crname" . }} -{{- if .Values.prometheus.service.sessionAffinity }} - sessionAffinity: {{ .Values.prometheus.service.sessionAffinity }} -{{- end }} - type: "{{ .Values.prometheus.service.type }}" -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/serviceThanosSidecar.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/serviceThanosSidecar.yaml deleted file mode 100644 index 2b80e7742f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/serviceThanosSidecar.yaml +++ /dev/null @@ -1,39 +0,0 @@ -{{- if and .Values.prometheus.enabled .Values.prometheus.thanosService.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-thanos-discovery - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-thanos-discovery -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.prometheus.thanosService.labels }} -{{ toYaml .Values.prometheus.thanosService.labels | indent 4 }} -{{- end }} -{{- if .Values.prometheus.thanosService.annotations }} - annotations: -{{ toYaml .Values.prometheus.thanosService.annotations | indent 4 }} -{{- end }} -spec: - type: {{ .Values.prometheus.thanosService.type }} - clusterIP: {{ .Values.prometheus.thanosService.clusterIP }} -{{- if ne .Values.prometheus.thanosService.type "ClusterIP" }} - externalTrafficPolicy: {{ .Values.prometheus.thanosService.externalTrafficPolicy }} -{{- end }} - ports: - - name: {{ .Values.prometheus.thanosService.portName }} - port: {{ .Values.prometheus.thanosService.port }} - targetPort: {{ .Values.prometheus.thanosService.targetPort }} - {{- if eq .Values.prometheus.thanosService.type "NodePort" }} - nodePort: {{ .Values.prometheus.thanosService.nodePort }} - {{- end }} - - name: {{ .Values.prometheus.thanosService.httpPortName }} - port: {{ .Values.prometheus.thanosService.httpPort }} - targetPort: {{ .Values.prometheus.thanosService.targetHttpPort }} - {{- if eq .Values.prometheus.thanosService.type "NodePort" }} - nodePort: {{ .Values.prometheus.thanosService.httpNodePort }} - {{- end }} - selector: - app.kubernetes.io/name: prometheus - prometheus: {{ template "kube-prometheus-stack.prometheus.crname" . }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/serviceThanosSidecarExternal.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/serviceThanosSidecarExternal.yaml deleted file mode 100644 index fa45934d74..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/serviceThanosSidecarExternal.yaml +++ /dev/null @@ -1,46 +0,0 @@ -{{- if and .Values.prometheus.enabled .Values.prometheus.thanosServiceExternal.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-thanos-external - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.prometheus.thanosServiceExternal.labels }} -{{ toYaml .Values.prometheus.thanosServiceExternal.labels | indent 4 }} -{{- end }} -{{- if .Values.prometheus.thanosServiceExternal.annotations }} - annotations: -{{ toYaml .Values.prometheus.thanosServiceExternal.annotations | indent 4 }} -{{- end }} -spec: - type: {{ .Values.prometheus.thanosServiceExternal.type }} -{{- if .Values.prometheus.thanosServiceExternal.loadBalancerIP }} - loadBalancerIP: {{ .Values.prometheus.thanosServiceExternal.loadBalancerIP }} -{{- end }} -{{- if .Values.prometheus.thanosServiceExternal.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- range $cidr := .Values.prometheus.thanosServiceExternal.loadBalancerSourceRanges }} - - {{ $cidr }} - {{- end }} -{{- end }} -{{- if ne .Values.prometheus.thanosServiceExternal.type "ClusterIP" }} - externalTrafficPolicy: {{ .Values.prometheus.thanosServiceExternal.externalTrafficPolicy }} -{{- end }} - ports: - - name: {{ .Values.prometheus.thanosServiceExternal.portName }} - port: {{ .Values.prometheus.thanosServiceExternal.port }} - targetPort: {{ .Values.prometheus.thanosServiceExternal.targetPort }} - {{- if eq .Values.prometheus.thanosServiceExternal.type "NodePort" }} - nodePort: {{ .Values.prometheus.thanosServiceExternal.nodePort }} - {{- end }} - - name: {{ .Values.prometheus.thanosServiceExternal.httpPortName }} - port: {{ .Values.prometheus.thanosServiceExternal.httpPort }} - targetPort: {{ .Values.prometheus.thanosServiceExternal.targetHttpPort }} - {{- if eq .Values.prometheus.thanosServiceExternal.type "NodePort" }} - nodePort: {{ .Values.prometheus.thanosServiceExternal.httpNodePort }} - {{- end }} - selector: - app.kubernetes.io/name: prometheus - prometheus: {{ template "kube-prometheus-stack.prometheus.crname" . }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/serviceaccount.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/serviceaccount.yaml deleted file mode 100644 index dde1632d6f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/serviceaccount.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if and .Values.prometheus.enabled .Values.prometheus.serviceAccount.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "kube-prometheus-stack.prometheus.serviceAccountName" . }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus - app.kubernetes.io/name: {{ template "kube-prometheus-stack.name" . }}-prometheus - app.kubernetes.io/component: prometheus -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- if .Values.prometheus.serviceAccount.annotations }} - annotations: -{{ toYaml .Values.prometheus.serviceAccount.annotations | indent 4 }} -{{- end }} -{{- if .Values.global.imagePullSecrets }} -imagePullSecrets: -{{ include "kube-prometheus-stack.imagePullSecrets" . | trim | indent 2 }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/servicemonitor.yaml deleted file mode 100644 index 410575cdbf..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/servicemonitor.yaml +++ /dev/null @@ -1,56 +0,0 @@ -{{- if and .Values.prometheus.enabled .Values.prometheus.serviceMonitor.selfMonitor }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- with .Values.prometheus.serviceMonitor.additionalLabels }} -{{- toYaml . | nindent 4 }} -{{- end }} -spec: - {{- include "servicemonitor.scrapeLimits" .Values.prometheus.serviceMonitor | nindent 2 }} - selector: - matchLabels: - app: {{ template "kube-prometheus-stack.name" . }}-prometheus - release: {{ $.Release.Name | quote }} - self-monitor: "true" - namespaceSelector: - matchNames: - - {{ printf "%s" (include "kube-prometheus-stack.namespace" .) | quote }} - endpoints: - - port: {{ .Values.prometheus.prometheusSpec.portName }} - {{- if .Values.prometheus.serviceMonitor.interval }} - interval: {{ .Values.prometheus.serviceMonitor.interval }} - {{- end }} - {{- if .Values.prometheus.serviceMonitor.scheme }} - scheme: {{ .Values.prometheus.serviceMonitor.scheme }} - {{- end }} - {{- if .Values.prometheus.serviceMonitor.tlsConfig }} - tlsConfig: {{ toYaml .Values.prometheus.serviceMonitor.tlsConfig | nindent 6 }} - {{- end }} - {{- if .Values.prometheus.serviceMonitor.bearerTokenFile }} - bearerTokenFile: {{ .Values.prometheus.serviceMonitor.bearerTokenFile }} - {{- end }} - path: "{{ trimSuffix "/" .Values.prometheus.prometheusSpec.routePrefix }}/metrics" - metricRelabelings: - {{- if .Values.prometheus.serviceMonitor.metricRelabelings }} - {{ tpl (toYaml .Values.prometheus.serviceMonitor.metricRelabelings | indent 6) . }} - {{- end }} - {{ if .Values.global.cattle.clusterId }} - - sourceLabels: [__address__] - targetLabel: cluster_id - replacement: {{ .Values.global.cattle.clusterId }} - {{- end }} - {{ if .Values.global.cattle.clusterName}} - - sourceLabels: [__address__] - targetLabel: cluster_name - replacement: {{ .Values.global.cattle.clusterName }} - {{- end }} -{{- if .Values.prometheus.serviceMonitor.relabelings }} - relabelings: -{{ toYaml .Values.prometheus.serviceMonitor.relabelings | indent 6 }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/servicemonitorThanosSidecar.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/servicemonitorThanosSidecar.yaml deleted file mode 100644 index 0f70aabb58..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/servicemonitorThanosSidecar.yaml +++ /dev/null @@ -1,55 +0,0 @@ -{{- if and .Values.prometheus.thanosService.enabled .Values.prometheus.thanosServiceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-thanos-sidecar - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-thanos-sidecar -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- with .Values.prometheus.thanosServiceMonitor.additionalLabels }} -{{- toYaml . | nindent 4 }} -{{- end }} -spec: - {{- include "servicemonitor.scrapeLimits" .Values.prometheus.thanosServiceMonitor | nindent 2 }} - selector: - matchLabels: - app: {{ template "kube-prometheus-stack.name" . }}-thanos-discovery - release: {{ $.Release.Name | quote }} - namespaceSelector: - matchNames: - - {{ printf "%s" (include "kube-prometheus-stack.namespace" .) | quote }} - endpoints: - - port: {{ .Values.prometheus.thanosService.httpPortName }} - {{- if .Values.prometheus.thanosServiceMonitor.interval }} - interval: {{ .Values.prometheus.thanosServiceMonitor.interval }} - {{- end }} - {{- if .Values.prometheus.thanosServiceMonitor.scheme }} - scheme: {{ .Values.prometheus.thanosServiceMonitor.scheme }} - {{- end }} - {{- if .Values.prometheus.thanosServiceMonitor.tlsConfig }} - tlsConfig: {{ toYaml .Values.prometheus.thanosServiceMonitor.tlsConfig | nindent 6 }} - {{- end }} - {{- if .Values.prometheus.thanosServiceMonitor.bearerTokenFile }} - bearerTokenFile: {{ .Values.prometheus.thanosServiceMonitor.bearerTokenFile }} - {{- end }} - path: "/metrics" - metricRelabelings: - {{- if .Values.prometheus.thanosServiceMonitor.metricRelabelings}} - {{ tpl (toYaml .Values.prometheus.thanosServiceMonitor.metricRelabelings | indent 6) . }} - {{- end }} - {{ if .Values.global.cattle.clusterId }} - - sourceLabels: [__address__] - targetLabel: cluster_id - replacement: {{ .Values.global.cattle.clusterId }} - {{- end }} - {{ if .Values.global.cattle.clusterName}} - - sourceLabels: [__address__] - targetLabel: cluster_name - replacement: {{ .Values.global.cattle.clusterName }} - {{- end }} -{{- if .Values.prometheus.thanosServiceMonitor.relabelings }} - relabelings: -{{ toYaml .Values.prometheus.thanosServiceMonitor.relabelings | indent 6 }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/servicemonitors.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/servicemonitors.yaml deleted file mode 100644 index 92a5412342..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/servicemonitors.yaml +++ /dev/null @@ -1,39 +0,0 @@ -{{- if and .Values.prometheus.enabled .Values.prometheus.additionalServiceMonitors }} -apiVersion: v1 -kind: List -items: -{{- range .Values.prometheus.additionalServiceMonitors }} - - apiVersion: monitoring.coreos.com/v1 - kind: ServiceMonitor - metadata: - name: {{ .name }} - namespace: {{ template "kube-prometheus-stack.namespace" $ }} - labels: - app: {{ template "kube-prometheus-stack.name" $ }}-prometheus -{{ include "kube-prometheus-stack.labels" $ | indent 8 }} - {{- if .additionalLabels }} -{{ toYaml .additionalLabels | indent 8 }} - {{- end }} - spec: - {{- include "servicemonitor.scrapeLimits" . | nindent 6 }} - endpoints: -{{ toYaml .endpoints | indent 8 }} - {{- if .jobLabel }} - jobLabel: {{ .jobLabel }} - {{- end }} - {{- if .namespaceSelector }} - namespaceSelector: -{{ toYaml .namespaceSelector | indent 8 }} - {{- end }} - selector: -{{ toYaml .selector | indent 8 }} - {{- if .targetLabels }} - targetLabels: -{{ toYaml .targetLabels | indent 8 }} - {{- end }} - {{- if .podTargetLabels }} - podTargetLabels: -{{ toYaml .podTargetLabels | indent 8 }} - {{- end }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/serviceperreplica.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/serviceperreplica.yaml deleted file mode 100644 index 8d2fdc33d7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/prometheus/serviceperreplica.yaml +++ /dev/null @@ -1,49 +0,0 @@ -{{- if and .Values.prometheus.enabled .Values.prometheus.servicePerReplica.enabled }} -{{- $count := .Values.prometheus.prometheusSpec.replicas | int -}} -{{- $serviceValues := .Values.prometheus.servicePerReplica -}} -apiVersion: v1 -kind: List -metadata: - name: {{ include "kube-prometheus-stack.fullname" $ }}-prometheus-serviceperreplica - namespace: {{ template "kube-prometheus-stack.namespace" . }} -items: -{{- range $i, $e := until $count }} - - apiVersion: v1 - kind: Service - metadata: - name: {{ include "kube-prometheus-stack.fullname" $ }}-prometheus-{{ $i }} - namespace: {{ template "kube-prometheus-stack.namespace" $ }} - labels: - app: {{ include "kube-prometheus-stack.name" $ }}-prometheus -{{ include "kube-prometheus-stack.labels" $ | indent 8 }} - {{- if $serviceValues.annotations }} - annotations: -{{ toYaml $serviceValues.annotations | indent 8 }} - {{- end }} - spec: - {{- if $serviceValues.clusterIP }} - clusterIP: {{ $serviceValues.clusterIP }} - {{- end }} - {{- if $serviceValues.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- range $cidr := $serviceValues.loadBalancerSourceRanges }} - - {{ $cidr }} - {{- end }} - {{- end }} - {{- if ne $serviceValues.type "ClusterIP" }} - externalTrafficPolicy: {{ $serviceValues.externalTrafficPolicy }} - {{- end }} - ports: - - name: {{ $.Values.prometheus.prometheusSpec.portName }} - {{- if eq $serviceValues.type "NodePort" }} - nodePort: {{ $serviceValues.nodePort }} - {{- end }} - port: {{ $serviceValues.port }} - targetPort: {{ $serviceValues.targetPort }} - selector: - app.kubernetes.io/name: prometheus - prometheus: {{ include "kube-prometheus-stack.prometheus.crname" $ }} - statefulset.kubernetes.io/pod-name: prometheus-{{ include "kube-prometheus-stack.prometheus.crname" $ }}-{{ $i }} - type: "{{ $serviceValues.type }}" -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/clusterrole.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/clusterrole.yaml deleted file mode 100644 index 56ca9f5eae..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/clusterrole.yaml +++ /dev/null @@ -1,135 +0,0 @@ -{{- if and .Values.global.rbac.create .Values.global.rbac.userRoles.create }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: monitoring-admin - labels: {{ include "kube-prometheus-stack.labels" . | nindent 4 }} - {{- if .Values.global.rbac.userRoles.aggregateToDefaultRoles }} - rbac.authorization.k8s.io/aggregate-to-admin: "true" - {{- end }} -rules: -- apiGroups: - - monitoring.coreos.com - resources: - - alertmanagers - - prometheuses - - prometheuses/finalizers - - alertmanagers/finalizers - verbs: - - 'get' - - 'list' - - 'watch' -- apiGroups: - - monitoring.coreos.com - resources: - - thanosrulers - - thanosrulers/finalizers - - servicemonitors - - podmonitors - - prometheusrules - - podmonitors - - probes - - probes/finalizers - - alertmanagerconfigs - verbs: - - '*' ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: monitoring-edit - labels: {{ include "kube-prometheus-stack.labels" . | nindent 4 }} - {{- if .Values.global.rbac.userRoles.aggregateToDefaultRoles }} - rbac.authorization.k8s.io/aggregate-to-edit: "true" - {{- end }} -rules: -- apiGroups: - - monitoring.coreos.com - resources: - - alertmanagers - - prometheuses - - prometheuses/finalizers - - alertmanagers/finalizers - verbs: - - 'get' - - 'list' - - 'watch' -- apiGroups: - - monitoring.coreos.com - resources: - - thanosrulers - - thanosrulers/finalizers - - servicemonitors - - podmonitors - - prometheusrules - - podmonitors - - probes - - alertmanagerconfigs - verbs: - - '*' ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: monitoring-view - labels: {{ include "kube-prometheus-stack.labels" . | nindent 4 }} - {{- if .Values.global.rbac.userRoles.aggregateToDefaultRoles }} - rbac.authorization.k8s.io/aggregate-to-view: "true" - {{- end }} -rules: -- apiGroups: - - monitoring.coreos.com - resources: - - alertmanagers - - prometheuses - - prometheuses/finalizers - - alertmanagers/finalizers - - thanosrulers - - thanosrulers/finalizers - - servicemonitors - - podmonitors - - prometheusrules - - podmonitors - - probes - - probes/finalizers - - alertmanagerconfigs - verbs: - - 'get' - - 'list' - - 'watch' ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: monitoring-ui-view - labels: {{ include "kube-prometheus-stack.labels" . | nindent 4 }} -rules: -- apiGroups: - - "" - resources: - - services/proxy - resourceNames: - - "http:{{ template "kube-prometheus-stack.fullname" . }}-prometheus:{{ .Values.prometheus.service.port }}" - - "https:{{ template "kube-prometheus-stack.fullname" . }}-prometheus:{{ .Values.prometheus.service.port }}" - - "http:{{ template "kube-prometheus-stack.fullname" . }}-alertmanager:{{ .Values.alertmanager.service.port }}" - - "https:{{ template "kube-prometheus-stack.fullname" . }}-alertmanager:{{ .Values.alertmanager.service.port }}" -{{- if .Values.grafana.enabled }} - - "http:{{ include "call-nested" (list . "grafana" "grafana.fullname") }}:{{ .Values.grafana.service.port }}" - - "https:{{ include "call-nested" (list . "grafana" "grafana.fullname") }}:{{ .Values.grafana.service.port }}" -{{- end }} - verbs: - - 'get' - - 'create' -- apiGroups: - - "" - resourceNames: - - {{ template "kube-prometheus-stack.fullname" . }}-prometheus - - {{ template "kube-prometheus-stack.fullname" . }}-alertmanager -{{- if .Values.grafana.enabled }} - - {{ include "call-nested" (list . "grafana" "grafana.fullname") }} -{{- end }} - resources: - - endpoints - verbs: - - list -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/config-role.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/config-role.yaml deleted file mode 100644 index f48ffc827e..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/config-role.yaml +++ /dev/null @@ -1,48 +0,0 @@ -{{- if and .Values.global.rbac.create .Values.global.rbac.userRoles.create }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: monitoring-config-admin - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: {{ include "kube-prometheus-stack.labels" . | nindent 4 }} -rules: -- apiGroups: - - "" - resources: - - configmaps - - secrets - verbs: - - '*' ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: monitoring-config-edit - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: {{ include "kube-prometheus-stack.labels" . | nindent 4 }} -rules: -- apiGroups: - - "" - resources: - - configmaps - - secrets - verbs: - - '*' ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: monitoring-config-view - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: {{ include "kube-prometheus-stack.labels" . | nindent 4 }} -rules: -- apiGroups: - - "" - resources: - - configmaps - - secrets - verbs: - - 'get' - - 'list' - - 'watch' -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboard-role.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboard-role.yaml deleted file mode 100644 index d2f81976a2..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboard-role.yaml +++ /dev/null @@ -1,47 +0,0 @@ -{{- if and .Values.global.rbac.create .Values.global.rbac.userRoles.create .Values.grafana.enabled }} -{{- if .Values.grafana.defaultDashboardsEnabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: monitoring-dashboard-admin - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - labels: {{ include "kube-prometheus-stack.labels" . | nindent 4 }} -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - '*' ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: monitoring-dashboard-edit - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - labels: {{ include "kube-prometheus-stack.labels" . | nindent 4 }} -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - '*' ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: monitoring-dashboard-view - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - labels: {{ include "kube-prometheus-stack.labels" . | nindent 4 }} -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - 'get' - - 'list' - - 'watch' -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/addons/ingress-nginx-dashboard.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/addons/ingress-nginx-dashboard.yaml deleted file mode 100644 index 7b51a0bf7a..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/addons/ingress-nginx-dashboard.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- if and .Values.grafana.enabled .Values.grafana.defaultDashboardsEnabled .Values.ingressNginx.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "ingress-nginx" | trunc 63 | trimSuffix "-" }} - {{- if .Values.grafana.sidecar.dashboards.annotations }} - annotations: {{ toYaml .Values.grafana.sidecar.dashboards.annotations | nindent 4 }} - {{- end }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: -{{ (.Files.Glob "files/ingress-nginx/*").AsConfig | indent 2 }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/cluster-dashboards.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/cluster-dashboards.yaml deleted file mode 100644 index d73b257451..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/cluster-dashboards.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if and .Values.grafana.enabled .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: rancher-default-dashboards-cluster - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: -{{ (.Files.Glob "files/rancher/cluster/*").AsConfig | indent 2 }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/default-dashboard.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/default-dashboard.yaml deleted file mode 100644 index 8865efa932..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/default-dashboard.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if and .Values.grafana.enabled .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: rancher-default-dashboards-home - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: -{{ (.Files.Glob "files/rancher/home/*").AsConfig | indent 2 }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/k8s-dashboards.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/k8s-dashboards.yaml deleted file mode 100644 index 2afae10ef7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/k8s-dashboards.yaml +++ /dev/null @@ -1,31 +0,0 @@ -{{- $files := (.Files.Glob "files/rancher/k8s/*").AsConfig }} -{{- $filesDict := (fromYaml $files) }} -{{- if not (include "exporter.kubeEtcd.enabled" .) }} -{{- $filesDict = (unset $filesDict "rancher-etcd-nodes.json") -}} -{{- $filesDict = (unset $filesDict "rancher-etcd.json") -}} -{{- end }} -{{- if not (include "exporter.kubeControllerManager.enabled" .) }} -{{- $filesDict = (unset $filesDict "rancher-k8s-components-nodes.json") -}} -{{- $filesDict = (unset $filesDict "rancher-k8s-components.json") -}} -{{- else }} -{{- $_ := (set $filesDict "rancher-k8s-components-nodes.json" (get $filesDict "rancher-k8s-components-nodes.json" | replace "kube-controller-manager" (include "exporter.kubeControllerManager.jobName" .))) -}} -{{- $_ := (set $filesDict "rancher-k8s-components.json" (get $filesDict "rancher-k8s-components.json" | replace "kube-controller-manager" (include "exporter.kubeControllerManager.jobName" .))) -}} -{{- end }} -{{ $files = (toYaml $filesDict) }} -{{- if and .Values.grafana.enabled .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: rancher-default-dashboards-k8s - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: -{{ $files | indent 2 }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/nodes-dashboards.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/nodes-dashboards.yaml deleted file mode 100644 index 172c36e9d1..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/nodes-dashboards.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if and .Values.grafana.enabled .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: rancher-default-dashboards-nodes - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: -{{ (.Files.Glob "files/rancher/nodes/*").AsConfig | indent 2 }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/performance-dashboards.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/performance-dashboards.yaml deleted file mode 100644 index 19836ec4e4..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/performance-dashboards.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- $selector := (include "rancher.serviceMonitor.selector" .) -}} -{{- if and .Values.grafana.enabled .Values.grafana.defaultDashboardsEnabled .Values.rancherMonitoring.enabled $selector }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: rancher-default-dashboards-performance-debugging - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: -{{ (.Files.Glob "files/rancher/performance/*").AsConfig | indent 2 }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/pods-dashboards.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/pods-dashboards.yaml deleted file mode 100644 index 940f18869b..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/pods-dashboards.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if and .Values.grafana.enabled .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: rancher-default-dashboards-pods - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: -{{ (.Files.Glob "files/rancher/pods/*").AsConfig | indent 2 }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/workload-dashboards.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/workload-dashboards.yaml deleted file mode 100644 index d146dacdd0..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/dashboards/rancher/workload-dashboards.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if and .Values.grafana.enabled .Values.grafana.defaultDashboardsEnabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: {{ .Values.grafana.defaultDashboards.namespace }} - name: rancher-default-dashboards-workloads - annotations: -{{ toYaml .Values.grafana.sidecar.dashboards.annotations | indent 4 }} - labels: - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- end }} - app: {{ template "kube-prometheus-stack.name" $ }}-grafana -{{ include "kube-prometheus-stack.labels" $ | indent 4 }} -data: -{{ (.Files.Glob "files/rancher/workloads/*").AsConfig | indent 2 }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/exporters/ingress-nginx/service.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/exporters/ingress-nginx/service.yaml deleted file mode 100644 index 53a9ad6897..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/exporters/ingress-nginx/service.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{- if and (not .Values.ingressNginx.enabled) (.Values.rkeIngressNginx.enabled) }} -{{- fail "Cannot set .Values.rkeIngressNginx.enabled=true when .Values.ingressNginx.enabled=false" }} -{{- end }} -{{- if and .Values.ingressNginx.enabled (not .Values.rkeIngressNginx.enabled) }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-ingress-nginx - labels: - app: {{ template "kube-prometheus-stack.name" . }}-ingress-nginx - jobLabel: ingress-nginx -{{ include "kube-prometheus-stack.labels" . | indent 4 }} - namespace: {{ .Values.ingressNginx.namespace }} -spec: - clusterIP: None - ports: - - name: http-metrics - port: {{ .Values.ingressNginx.service.port }} - protocol: TCP - targetPort: {{ .Values.ingressNginx.service.targetPort }} - selector: - {{- if .Values.ingressNginx.service.selector }} -{{ toYaml .Values.ingressNginx.service.selector | indent 4 }} - {{- else }} - app: ingress-nginx - {{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/exporters/ingress-nginx/servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/exporters/ingress-nginx/servicemonitor.yaml deleted file mode 100644 index b0f92e63b5..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/exporters/ingress-nginx/servicemonitor.yaml +++ /dev/null @@ -1,49 +0,0 @@ -{{- if and (not .Values.ingressNginx.enabled) (.Values.rkeIngressNginx.enabled) }} -{{- fail "Cannot set .Values.rkeIngressNginx.enabled=true when .Values.ingressNginx.enabled=false" }} -{{- end }} -{{- if and .Values.ingressNginx.enabled (not .Values.rkeIngressNginx.enabled) }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-ingress-nginx - namespace: {{ .Values.ingressNginx.namespace }} - labels: - app: {{ template "kube-prometheus-stack.name" . }}-ingress-nginx -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - jobLabel: jobLabel - selector: - matchLabels: - app: {{ template "kube-prometheus-stack.name" . }}-ingress-nginx - release: {{ $.Release.Name | quote }} - namespaceSelector: - matchNames: - - {{ .Values.ingressNginx.namespace }} - endpoints: - - port: http-metrics - {{- if .Values.ingressNginx.serviceMonitor.interval}} - interval: {{ .Values.ingressNginx.serviceMonitor.interval }} - {{- end }} - {{- if .Values.ingressNginx.serviceMonitor.proxyUrl }} - proxyUrl: {{ .Values.ingressNginx.serviceMonitor.proxyUrl}} - {{- end }} - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token - metricRelabelings: - {{- if .Values.ingressNginx.serviceMonitor.metricRelabelings }} - {{ tpl (toYaml .Values.ingressNginx.serviceMonitor.metricRelabelings | indent 4) . }} - {{- end }} - {{ if .Values.global.cattle.clusterId }} - - sourceLabels: [__address__] - targetLabel: cluster_id - replacement: {{ .Values.global.cattle.clusterId }} - {{- end }} - {{ if .Values.global.cattle.clusterName}} - - sourceLabels: [__address__] - targetLabel: cluster_name - replacement: {{ .Values.global.cattle.clusterName }} - {{- end }} -{{- if .Values.ingressNginx.serviceMonitor.relabelings }} - relabelings: -{{ toYaml .Values.ingressNginx.serviceMonitor.relabelings | indent 4 }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/exporters/rancher/servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/exporters/rancher/servicemonitor.yaml deleted file mode 100644 index 1fba8f23f7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/exporters/rancher/servicemonitor.yaml +++ /dev/null @@ -1,58 +0,0 @@ -{{- $selector := (include "rancher.serviceMonitor.selector" .) -}} -{{- if and .Values.rancherMonitoring.enabled $selector }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - labels: {{ include "kube-prometheus-stack.labels" . | nindent 4 }} - name: rancher - namespace: cattle-system -spec: - endpoints: - - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token - port: http - tlsConfig: - caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - insecureSkipVerify: true - serverName: rancher - metricRelabelings: - {{ if .Values.global.cattle.clusterId }} - - sourceLabels: [__address__] - targetLabel: cluster_id - replacement: {{ .Values.global.cattle.clusterId }} - {{- end }} - {{ if .Values.global.cattle.clusterName}} - - sourceLabels: [__address__] - targetLabel: cluster_name - replacement: {{ .Values.global.cattle.clusterName }} - {{- end }} - jobLabel: rancher -{{- if .Values.rancherMonitoring.namespaceSelector }} - namespaceSelector: {{ .Values.rancherMonitoring.namespaceSelector | toYaml | nindent 4 }} -{{- end }} - selector: {{ include "rancher.serviceMonitor.selector" . | nindent 4 }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-rancher-metrics -rules: -- apiGroups: - - management.cattle.io - resources: - - ranchermetrics - verbs: - - get ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-rancher-metrics -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "kube-prometheus-stack.fullname" . }}-rancher-metrics -subjects: - - kind: ServiceAccount - name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus - namespace: {{ template "kube-prometheus-stack.namespace" . }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/hardened.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/hardened.yaml deleted file mode 100644 index f9a66151ee..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/hardened.yaml +++ /dev/null @@ -1,147 +0,0 @@ -{{- $namespaces := dict "_0" .Release.Namespace -}} -{{- if and .Values.grafana.enabled .Values.grafana.defaultDashboardsEnabled (not .Values.grafana.defaultDashboards.useExistingNamespace) -}} -{{- $_ := set $namespaces "_1" .Values.grafana.defaultDashboards.namespace -}} -{{- end -}} -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ .Chart.Name }}-patch-sa - namespace: {{ .Release.Namespace }} - labels: - app: {{ .Chart.Name }}-patch-sa - annotations: - "helm.sh/hook": post-install, post-upgrade - "helm.sh/hook-delete-policy": hook-succeeded, before-hook-creation -spec: - template: - metadata: - name: {{ .Chart.Name }}-patch-sa - labels: - app: {{ .Chart.Name }}-patch-sa - spec: - serviceAccountName: {{ .Chart.Name }}-patch-sa - securityContext: - runAsNonRoot: true - runAsUser: 1000 - restartPolicy: Never - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} - containers: - {{- range $_, $ns := $namespaces }} - - name: patch-sa-{{ $ns }} - image: {{ template "system_default_registry" $ }}{{ $.Values.global.kubectl.repository }}:{{ $.Values.global.kubectl.tag }} - imagePullPolicy: {{ $.Values.global.kubectl.pullPolicy }} - command: ["kubectl", "patch", "serviceaccount", "default", "-p", "{\"automountServiceAccountToken\": false}"] - args: ["-n", "{{ $ns }}"] - {{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ .Chart.Name }}-patch-sa - labels: - app: {{ .Chart.Name }}-patch-sa -rules: -- apiGroups: - - "" - resources: - - serviceaccounts - verbs: ['get', 'patch'] -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ .Chart.Name }}-patch-sa -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ .Chart.Name }}-patch-sa - labels: - app: {{ .Chart.Name }}-patch-sa -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ .Chart.Name }}-patch-sa -subjects: -- kind: ServiceAccount - name: {{ .Chart.Name }}-patch-sa - namespace: {{ .Release.Namespace }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ .Chart.Name }}-patch-sa - namespace: {{ .Release.Namespace }} - labels: - app: {{ .Chart.Name }}-patch-sa ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ .Chart.Name }}-patch-sa - namespace: {{ .Release.Namespace }} - labels: - app: {{ .Chart.Name }}-patch-sa -spec: - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'secret' -{{- range $_, $ns := $namespaces }} ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: default-allow-all - namespace: {{ $ns }} -spec: - podSelector: {} - ingress: - - {} - egress: - - {} - policyTypes: - - Ingress - - Egress -{{- end }} -{{- end }} ---- -{{- if .Values.hardened.k3s.networkPolicy.enabled }} -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: rancher-monitoring-coredns-allow-all - namespace: kube-system -spec: - ingress: - - {} - egress: - - {} - policyTypes: - - Ingress - - Egress - podSelector: - matchLabels: - k8s-app: kube-dns -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/upgrade/configmap.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/upgrade/configmap.yaml deleted file mode 100644 index 53cb898214..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/upgrade/configmap.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if .Values.upgrade.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - namespace: {{ template "kube-prometheus-stack.namespace" . }} - annotations: - "helm.sh/hook": pre-upgrade, pre-rollback - "helm.sh/hook-delete-policy": before-hook-creation, hook-succeeded, hook-failed - "helm.sh/hook-weight": "0" -data: -{{ (.Files.Glob "files/upgrade/scripts/*").AsConfig | indent 2 }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/upgrade/job.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/upgrade/job.yaml deleted file mode 100644 index 8f2771740c..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/upgrade/job.yaml +++ /dev/null @@ -1,46 +0,0 @@ -{{- if .Values.upgrade.enabled }} -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - annotations: - "helm.sh/hook": pre-upgrade, pre-rollback - "helm.sh/hook-delete-policy": before-hook-creation, hook-succeeded, hook-failed - "helm.sh/hook-weight": "2" -spec: - template: - metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - labels: - app: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - spec: - serviceAccountName: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - securityContext: - runAsNonRoot: false - runAsUser: 0 - restartPolicy: Never - nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} - tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} - containers: - - name: run-scripts - image: {{ template "system_default_registry" . }}{{ .Values.upgrade.image.repository }}:{{ .Values.upgrade.image.tag }} - imagePullPolicy: {{ $.Values.global.kubectl.pullPolicy }} - command: - - /bin/sh - - -c - - > - for s in $(find /etc/scripts -type f); do - echo "Running $s..."; - cat $s | bash - done; - volumeMounts: - - name: upgrade - mountPath: /etc/scripts - volumes: - - name: upgrade - configMap: - name: {{ template "kube-prometheus-stack.fullname" . }}-upgrade -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/upgrade/rbac.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/upgrade/rbac.yaml deleted file mode 100644 index e929a19925..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/rancher-monitoring/upgrade/rbac.yaml +++ /dev/null @@ -1,131 +0,0 @@ -{{- if .Values.upgrade.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - annotations: - "helm.sh/hook": pre-upgrade, pre-rollback - "helm.sh/hook-delete-policy": before-hook-creation, hook-succeeded - "helm.sh/hook-weight": "1" -rules: -- apiGroups: - - apps - resources: - - deployments - - daemonsets - - statefulsets - verbs: - - 'list' - - 'delete' ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - annotations: - "helm.sh/hook": pre-upgrade, pre-rollback - "helm.sh/hook-delete-policy": before-hook-creation, hook-succeeded, hook-failed - "helm.sh/hook-weight": "1" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "kube-prometheus-stack.fullname" . }}-upgrade -subjects: -- kind: ServiceAccount - name: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - namespace: {{ template "kube-prometheus-stack.namespace" . }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - labels: - app: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - annotations: - "helm.sh/hook": pre-upgrade, pre-rollback - "helm.sh/hook-delete-policy": before-hook-creation, hook-succeeded, hook-failed - "helm.sh/hook-weight": "1" -rules: -{{- if .Values.global.cattle.psp.enabled }} -- apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "kube-prometheus-stack.fullname" . }}-upgrade -{{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - labels: - app: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - annotations: - "helm.sh/hook": pre-upgrade, pre-rollback - "helm.sh/hook-delete-policy": before-hook-creation, hook-succeeded, hook-failed - "helm.sh/hook-weight": "1" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "kube-prometheus-stack.fullname" . }}-upgrade -subjects: -- kind: ServiceAccount - name: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - namespace: {{ template "kube-prometheus-stack.namespace" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - annotations: - "helm.sh/hook": pre-upgrade, pre-rollback - "helm.sh/hook-delete-policy": before-hook-creation, hook-succeeded, hook-failed - "helm.sh/hook-weight": "1" ---- -{{- if .Values.global.cattle.psp.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.fullname" . }}-upgrade - annotations: - "helm.sh/hook": pre-upgrade, pre-rollback - "helm.sh/hook-delete-policy": before-hook-creation, hook-succeeded, hook-failed - "helm.sh/hook-weight": "1" -spec: - privileged: false - allowPrivilegeEscalation: false - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - volumes: - - 'configMap' - - 'secret' -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/extrasecret.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/extrasecret.yaml deleted file mode 100644 index 587fca2dca..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/extrasecret.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.thanosRuler.extraSecret.data -}} -{{- $secretName := printf "%s-extra" (include "kube-prometheus-stack.thanosRuler.name" . ) -}} -apiVersion: v1 -kind: Secret -metadata: - name: {{ default $secretName .Values.thanosRuler.extraSecret.name }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} -{{- if .Values.thanosRuler.extraSecret.annotations }} - annotations: -{{ toYaml .Values.thanosRuler.extraSecret.annotations | indent 4 }} -{{- end }} - labels: - app: {{ template "kube-prometheus-stack.thanosRuler.name" . }} - app.kubernetes.io/component: thanos-ruler -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -data: -{{- range $key, $val := .Values.thanosRuler.extraSecret.data }} - {{ $key }}: {{ $val | b64enc | quote }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/ingress.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/ingress.yaml deleted file mode 100644 index aed9db280f..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/ingress.yaml +++ /dev/null @@ -1,77 +0,0 @@ -{{- if and .Values.thanosRuler.enabled .Values.thanosRuler.ingress.enabled }} -{{- $pathType := .Values.thanosRuler.ingress.pathType | default "ImplementationSpecific" }} -{{- $serviceName := include "kube-prometheus-stack.thanosRuler.name" . }} -{{- $servicePort := .Values.thanosRuler.service.port -}} -{{- $routePrefix := list .Values.thanosRuler.thanosRulerSpec.routePrefix }} -{{- $paths := .Values.thanosRuler.ingress.paths | default $routePrefix -}} -{{- $apiIsStable := eq (include "kube-prometheus-stack.ingress.isStable" .) "true" -}} -{{- $ingressSupportsPathType := eq (include "kube-prometheus-stack.ingress.supportsPathType" .) "true" -}} -apiVersion: {{ include "kube-prometheus-stack.ingress.apiVersion" . }} -kind: Ingress -metadata: - name: {{ $serviceName }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} -{{- if .Values.thanosRuler.ingress.annotations }} - annotations: -{{ toYaml .Values.thanosRuler.ingress.annotations | indent 4 }} -{{- end }} - labels: - app: {{ template "kube-prometheus-stack.thanosRuler.name" . }} -{{- if .Values.thanosRuler.ingress.labels }} -{{ toYaml .Values.thanosRuler.ingress.labels | indent 4 }} -{{- end }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - {{- if $apiIsStable }} - {{- if .Values.thanosRuler.ingress.ingressClassName }} - ingressClassName: {{ .Values.thanosRuler.ingress.ingressClassName }} - {{- end }} - {{- end }} - rules: - {{- if .Values.thanosRuler.ingress.hosts }} - {{- range $host := .Values.thanosRuler.ingress.hosts }} - - host: {{ tpl $host $ }} - http: - paths: - {{- range $p := $paths }} - - path: {{ tpl $p $ }} - {{- if and $pathType $ingressSupportsPathType }} - pathType: {{ $pathType }} - {{- end }} - backend: - {{- if $apiIsStable }} - service: - name: {{ $serviceName }} - port: - number: {{ $servicePort }} - {{- else }} - serviceName: {{ $serviceName }} - servicePort: {{ $servicePort }} - {{- end }} - {{- end -}} - {{- end -}} - {{- else }} - - http: - paths: - {{- range $p := $paths }} - - path: {{ tpl $p $ }} - {{- if and $pathType $ingressSupportsPathType }} - pathType: {{ $pathType }} - {{- end }} - backend: - {{- if $apiIsStable }} - service: - name: {{ $serviceName }} - port: - number: {{ $servicePort }} - {{- else }} - serviceName: {{ $serviceName }} - servicePort: {{ $servicePort }} - {{- end }} - {{- end -}} - {{- end -}} - {{- if .Values.thanosRuler.ingress.tls }} - tls: -{{ tpl (toYaml .Values.thanosRuler.ingress.tls | indent 4) . }} - {{- end -}} -{{- end -}} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/podDisruptionBudget.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/podDisruptionBudget.yaml deleted file mode 100644 index 83e54edf9b..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/podDisruptionBudget.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if and .Values.thanosRuler.enabled .Values.thanosRuler.podDisruptionBudget.enabled }} -apiVersion: {{ include "kube-prometheus-stack.pdb.apiVersion" . }} -kind: PodDisruptionBudget -metadata: - name: {{ template "kube-prometheus-stack.thanosRuler.name" . }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.thanosRuler.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -spec: - {{- if .Values.thanosRuler.podDisruptionBudget.minAvailable }} - minAvailable: {{ .Values.thanosRuler.podDisruptionBudget.minAvailable }} - {{- end }} - {{- if .Values.thanosRuler.podDisruptionBudget.maxUnavailable }} - maxUnavailable: {{ .Values.thanosRuler.podDisruptionBudget.maxUnavailable }} - {{- end }} - selector: - matchLabels: - app.kubernetes.io/name: thanos-ruler - thanos-ruler: {{ template "kube-prometheus-stack.thanosRuler.name" . }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/ruler.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/ruler.yaml deleted file mode 100644 index d4a4cf97a0..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/ruler.yaml +++ /dev/null @@ -1,173 +0,0 @@ -{{- if .Values.thanosRuler.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ThanosRuler -metadata: - name: {{ template "kube-prometheus-stack.thanosRuler.name" . }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ include "kube-prometheus-stack.thanosRuler.name" . }} -{{- include "kube-prometheus-stack.labels" . | indent 4 -}} -{{- if .Values.thanosRuler.annotations }} - annotations: -{{ toYaml .Values.thanosRuler.annotations | indent 4 }} -{{- end }} -spec: -{{- if .Values.thanosRuler.thanosRulerSpec.image }} - {{- $registry := include "monitoring_registry" . | default .Values.thanosRuler.thanosRulerSpec.image.registry -}} - {{- if and .Values.thanosRuler.thanosRulerSpec.image.tag .Values.thanosRuler.thanosRulerSpec.image.sha }} - image: "{{ $registry }}/{{ .Values.thanosRuler.thanosRulerSpec.image.repository }}:{{ .Values.thanosRuler.thanosRulerSpec.image.tag }}@sha256:{{ .Values.thanosRuler.thanosRulerSpec.image.sha }}" - {{- else if .Values.thanosRuler.thanosRulerSpec.image.sha }} - image: "{{ $registry }}/{{ .Values.thanosRuler.thanosRulerSpec.image.repository }}@sha256:{{ .Values.thanosRuler.thanosRulerSpec.image.sha }}" - {{- else if .Values.thanosRuler.thanosRulerSpec.image.tag }} - image: "{{ $registry }}/{{ .Values.thanosRuler.thanosRulerSpec.image.repository }}:{{ .Values.thanosRuler.thanosRulerSpec.image.tag }}" - {{- else }} - image: "{{ $registry }}/{{ .Values.thanosRuler.thanosRulerSpec.image.repository }}" - {{- end }} - {{- if .Values.thanosRuler.thanosRulerSpec.image.sha }} - sha: {{ .Values.thanosRuler.thanosRulerSpec.image.sha }} - {{- end }} -{{- end }} - replicas: {{ .Values.thanosRuler.thanosRulerSpec.replicas }} - listenLocal: {{ .Values.thanosRuler.thanosRulerSpec.listenLocal }} - serviceAccountName: {{ template "kube-prometheus-stack.thanosRuler.serviceAccountName" . }} -{{- if .Values.thanosRuler.thanosRulerSpec.externalPrefix }} - externalPrefix: "{{ tpl .Values.thanosRuler.thanosRulerSpec.externalPrefix . }}" -{{- else if and .Values.thanosRuler.ingress.enabled .Values.thanosRuler.ingress.hosts }} - externalPrefix: "http://{{ tpl (index .Values.thanosRuler.ingress.hosts 0) . }}{{ .Values.thanosRuler.thanosRulerSpec.routePrefix }}" -{{- else }} - externalPrefix: http://{{ template "kube-prometheus-stack.thanosRuler.name" . }}.{{ template "kube-prometheus-stack.namespace" . }}:{{ .Values.thanosRuler.service.port }} -{{- end }} - nodeSelector: {{ include "linux-node-selector" . | nindent 4 }} -{{- if .Values.thanosRuler.thanosRulerSpec.nodeSelector }} -{{ toYaml .Values.thanosRuler.thanosRulerSpec.nodeSelector | indent 4 }} -{{- end }} - paused: {{ .Values.thanosRuler.thanosRulerSpec.paused }} - logFormat: {{ .Values.thanosRuler.thanosRulerSpec.logFormat | quote }} - logLevel: {{ .Values.thanosRuler.thanosRulerSpec.logLevel | quote }} - retention: {{ .Values.thanosRuler.thanosRulerSpec.retention | quote }} -{{- if .Values.thanosRuler.thanosRulerSpec.evaluationInterval }} - evaluationInterval: {{ .Values.thanosRuler.thanosRulerSpec.evaluationInterval }} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.ruleNamespaceSelector }} - ruleNamespaceSelector: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.ruleNamespaceSelector | indent 4 }} -{{ else }} - ruleNamespaceSelector: {} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.ruleSelector }} - ruleSelector: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.ruleSelector | indent 4}} -{{- else if .Values.thanosRuler.thanosRulerSpec.ruleSelectorNilUsesHelmValues }} - ruleSelector: - matchLabels: - release: {{ $.Release.Name | quote }} -{{ else }} - ruleSelector: {} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.alertQueryUrl }} - alertQueryUrl: "{{ .Values.thanosRuler.thanosRulerSpec.alertQueryUrl }}" -{{- end}} -{{- if .Values.thanosRuler.thanosRulerSpec.alertmanagersUrl }} - alertmanagersUrl: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.alertmanagersUrl | indent 4 }} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.alertmanagersConfig }} - alertmanagersConfig: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.alertmanagersConfig | indent 4 }} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.queryEndpoints }} - queryEndpoints: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.queryEndpoints | indent 4 }} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.queryConfig }} - queryConfig: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.queryConfig | indent 4 }} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.resources }} - resources: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.resources | indent 4 }} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.routePrefix }} - routePrefix: "{{ .Values.thanosRuler.thanosRulerSpec.routePrefix }}" -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.securityContext }} - securityContext: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.securityContext | indent 4 }} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.storage }} - storage: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.storage | indent 4 }} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.objectStorageConfig }} - objectStorageConfig: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.objectStorageConfig | indent 4 }} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.labels }} - labels: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.labels | indent 4 }} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.objectStorageConfigFile }} - objectStorageConfigFile: {{ .Values.thanosRuler.thanosRulerSpec.objectStorageConfigFile }} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.podMetadata }} - podMetadata: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.podMetadata | indent 4 }} -{{- end }} -{{- if or .Values.thanosRuler.thanosRulerSpec.podAntiAffinity .Values.thanosRuler.thanosRulerSpec.affinity }} - affinity: -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.affinity }} -{{ toYaml .Values.thanosRuler.thanosRulerSpec.affinity | indent 4 }} -{{- end }} -{{- if eq .Values.thanosRuler.thanosRulerSpec.podAntiAffinity "hard" }} - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - topologyKey: {{ .Values.thanosRuler.thanosRulerSpec.podAntiAffinityTopologyKey }} - labelSelector: - matchExpressions: - - {key: app.kubernetes.io/name, operator: In, values: [thanos-ruler]} - - {key: thanos-ruler, operator: In, values: [{{ template "kube-prometheus-stack.thanosRuler.name" . }}]} -{{- else if eq .Values.thanosRuler.thanosRulerSpec.podAntiAffinity "soft" }} - podAntiAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - weight: 100 - podAffinityTerm: - topologyKey: {{ .Values.thanosRuler.thanosRulerSpec.podAntiAffinityTopologyKey }} - labelSelector: - matchExpressions: - - {key: app.kubernetes.io/name, operator: In, values: [thanos-ruler]} - - {key: thanos-ruler, operator: In, values: [{{ template "kube-prometheus-stack.thanosRuler.name" . }}]} -{{- end }} - tolerations: {{ include "linux-node-tolerations" . | nindent 4 }} -{{- if .Values.thanosRuler.thanosRulerSpec.tolerations }} -{{ toYaml .Values.thanosRuler.thanosRulerSpec.tolerations | indent 4 }} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.topologySpreadConstraints }} - topologySpreadConstraints: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.topologySpreadConstraints | indent 4 }} -{{- end }} -{{- if .Values.global.imagePullSecrets }} - imagePullSecrets: -{{ toYaml .Values.global.imagePullSecrets | indent 4 }} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.containers }} - containers: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.containers | indent 4 }} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.initContainers }} - initContainers: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.initContainers | indent 4 }} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.priorityClassName }} - priorityClassName: {{.Values.thanosRuler.thanosRulerSpec.priorityClassName }} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.volumes }} - volumes: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.volumes | indent 4 }} -{{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.volumeMounts }} - volumeMounts: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.volumeMounts | indent 4 }} -{{- end }} - portName: {{ .Values.thanosRuler.thanosRulerSpec.portName }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/service.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/service.yaml deleted file mode 100644 index be0c844591..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/service.yaml +++ /dev/null @@ -1,53 +0,0 @@ -{{- if .Values.thanosRuler.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kube-prometheus-stack.thanosRuler.name" . }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.thanosRuler.name" . }} - self-monitor: {{ .Values.thanosRuler.serviceMonitor.selfMonitor | quote }} -{{- include "kube-prometheus-stack.labels" . | indent 4 -}} -{{- if .Values.thanosRuler.service.labels }} -{{ toYaml .Values.thanosRuler.service.labels | indent 4 }} -{{- end }} -{{- if .Values.thanosRuler.service.annotations }} - annotations: -{{ toYaml .Values.thanosRuler.service.annotations | indent 4 }} -{{- end }} -spec: -{{- if .Values.thanosRuler.service.clusterIP }} - clusterIP: {{ .Values.thanosRuler.service.clusterIP }} -{{- end }} -{{- if .Values.thanosRuler.service.externalIPs }} - externalIPs: -{{ toYaml .Values.thanosRuler.service.externalIPs | indent 4 }} -{{- end }} -{{- if .Values.thanosRuler.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.thanosRuler.service.loadBalancerIP }} -{{- end }} -{{- if .Values.thanosRuler.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- range $cidr := .Values.thanosRuler.service.loadBalancerSourceRanges }} - - {{ $cidr }} - {{- end }} -{{- end }} -{{- if ne .Values.thanosRuler.service.type "ClusterIP" }} - externalTrafficPolicy: {{ .Values.thanosRuler.service.externalTrafficPolicy }} -{{- end }} - ports: - - name: {{ .Values.thanosRuler.thanosRulerSpec.portName }} - {{- if eq .Values.thanosRuler.service.type "NodePort" }} - nodePort: {{ .Values.thanosRuler.service.nodePort }} - {{- end }} - port: {{ .Values.thanosRuler.service.port }} - targetPort: {{ .Values.thanosRuler.service.targetPort }} - protocol: TCP -{{- if .Values.thanosRuler.service.additionalPorts }} -{{ toYaml .Values.thanosRuler.service.additionalPorts | indent 2 }} -{{- end }} - selector: - app.kubernetes.io/name: thanos-ruler - thanos-ruler: {{ template "kube-prometheus-stack.thanosRuler.name" . }} - type: "{{ .Values.thanosRuler.service.type }}" -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/serviceaccount.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/serviceaccount.yaml deleted file mode 100644 index b58f1cd4df..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/serviceaccount.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if and .Values.thanosRuler.enabled .Values.thanosRuler.serviceAccount.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "kube-prometheus-stack.thanosRuler.serviceAccountName" . }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.thanosRuler.name" . }} - app.kubernetes.io/name: {{ template "kube-prometheus-stack.thanosRuler.name" . }} - app.kubernetes.io/component: thanos-ruler -{{- include "kube-prometheus-stack.labels" . | indent 4 -}} -{{- if .Values.thanosRuler.serviceAccount.annotations }} - annotations: -{{ toYaml .Values.thanosRuler.serviceAccount.annotations | indent 4 }} -{{- end }} -{{- if .Values.global.imagePullSecrets }} -imagePullSecrets: -{{ toYaml .Values.global.imagePullSecrets | indent 2 }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/servicemonitor.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/servicemonitor.yaml deleted file mode 100644 index 1c4cfab9b9..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/thanos-ruler/servicemonitor.yaml +++ /dev/null @@ -1,60 +0,0 @@ -{{- if and .Values.thanosRuler.enabled .Values.thanosRuler.serviceMonitor.selfMonitor }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "kube-prometheus-stack.thanosRuler.name" . }} - namespace: {{ template "kube-prometheus-stack.namespace" . }} - labels: - app: {{ template "kube-prometheus-stack.thanosRuler.name" . }} -{{ include "kube-prometheus-stack.labels" . | indent 4 }} -{{- with .Values.thanosRuler.serviceMonitor.additionalLabels }} -{{- toYaml . | nindent 4 }} -{{- end }} -spec: - {{- include "servicemonitor.scrapeLimits" .Values.thanosRuler.serviceMonitor | nindent 2 }} - selector: - matchLabels: - app: {{ template "kube-prometheus-stack.thanosRuler.name" . }} - release: {{ $.Release.Name | quote }} - self-monitor: {{ .Values.thanosRuler.serviceMonitor.selfMonitor | quote }} - namespaceSelector: - matchNames: - - {{ printf "%s" (include "kube-prometheus-stack.namespace" .) | quote }} - endpoints: - - port: {{ .Values.thanosRuler.thanosRulerSpec.portName }} - {{- if .Values.thanosRuler.serviceMonitor.interval }} - interval: {{ .Values.thanosRuler.serviceMonitor.interval }} - {{- end }} - {{- if .Values.thanosRuler.serviceMonitor.proxyUrl }} - proxyUrl: {{ .Values.thanosRuler.serviceMonitor.proxyUrl}} - {{- end }} - {{- if .Values.thanosRuler.serviceMonitor.scheme }} - scheme: {{ .Values.thanosRuler.serviceMonitor.scheme }} - {{- end }} - {{- if .Values.thanosRuler.serviceMonitor.bearerTokenFile }} - bearerTokenFile: {{ .Values.thanosRuler.serviceMonitor.bearerTokenFile }} - {{- end }} - {{- if .Values.thanosRuler.serviceMonitor.tlsConfig }} - tlsConfig: {{ toYaml .Values.thanosRuler.serviceMonitor.tlsConfig | nindent 6 }} - {{- end }} - path: "{{ trimSuffix "/" .Values.thanosRuler.thanosRulerSpec.routePrefix }}/metrics" - - metricRelabelings: - {{- if .Values.thanosRuler.serviceMonitor.metricRelabelings }} - {{ tpl (toYaml .Values.thanosRuler.serviceMonitor.metricRelabelings | indent 6) . }} - {{- end }} - {{ if .Values.global.cattle.clusterId }} - - sourceLabels: [__address__] - targetLabel: cluster_id - replacement: {{ .Values.global.cattle.clusterId }} - {{- end }} - {{ if .Values.global.cattle.clusterName}} - - sourceLabels: [__address__] - targetLabel: cluster_name - replacement: {{ .Values.global.cattle.clusterName }} - {{- end }} -{{- if .Values.thanosRuler.serviceMonitor.relabelings }} - relabelings: -{{ toYaml .Values.thanosRuler.serviceMonitor.relabelings | indent 6 }} -{{- end }} -{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/validate-install-crd.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/validate-install-crd.yaml deleted file mode 100644 index ac7921f586..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/validate-install-crd.yaml +++ /dev/null @@ -1,21 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -# {{- $found := dict -}} -# {{- set $found "monitoring.coreos.com/v1alpha1/AlertmanagerConfig" false -}} -# {{- set $found "monitoring.coreos.com/v1/Alertmanager" false -}} -# {{- set $found "monitoring.coreos.com/v1/PodMonitor" false -}} -# {{- set $found "monitoring.coreos.com/v1/Probe" false -}} -# {{- set $found "monitoring.coreos.com/v1/Prometheus" false -}} -# {{- set $found "monitoring.coreos.com/v1/PrometheusRule" false -}} -# {{- set $found "monitoring.coreos.com/v1/ServiceMonitor" false -}} -# {{- set $found "monitoring.coreos.com/v1/ThanosRuler" false -}} -# {{- range .Capabilities.APIVersions -}} -# {{- if hasKey $found (toString .) -}} -# {{- set $found (toString .) true -}} -# {{- end -}} -# {{- end -}} -# {{- range $_, $exists := $found -}} -# {{- if (eq $exists false) -}} -# {{- required "Required CRDs are missing. Please install the corresponding CRD chart before installing this chart." "" -}} -# {{- end -}} -# {{- end -}} -#{{- end -}} \ No newline at end of file diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/validate-psp-install.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/templates/validate-psp-install.yaml deleted file mode 100644 index a30c59d3b7..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/templates/validate-psp-install.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} -#{{- if .Values.global.cattle.psp.enabled }} -#{{- if not (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -#{{- fail "The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding." -}} -#{{- end }} -#{{- end }} -#{{- end }} diff --git a/charts/rancher-monitoring/103.1.2+up45.31.1/values.yaml b/charts/rancher-monitoring/103.1.2+up45.31.1/values.yaml deleted file mode 100644 index 3443fa6147..0000000000 --- a/charts/rancher-monitoring/103.1.2+up45.31.1/values.yaml +++ /dev/null @@ -1,4679 +0,0 @@ -# Default values for kube-prometheus-stack. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -# Rancher Monitoring Configuration - -## Configuration for prometheus-adapter -## ref: https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-adapter -## -prometheus-adapter: - enabled: true - prometheus: - # Change this if you change the namespaceOverride or nameOverride of prometheus-operator - url: http://rancher-monitoring-prometheus.cattle-monitoring-system.svc - port: 9090 - -## RKE PushProx Monitoring -## ref: https://github.com/rancher/charts/tree/dev-v2.5-source/packages/rancher-pushprox -## -rkeControllerManager: - enabled: false - metricsPort: 10257 # default to secure port as of k8s >= 1.22 - component: kube-controller-manager - clients: - https: - enabled: true - insecureSkipVerify: true - useServiceAccountCredentials: true - port: 10011 - useLocalhost: true - nodeSelector: - node-role.kubernetes.io/controlplane: "true" - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - kubeVersionOverrides: - - constraint: "< 1.22" - values: - metricsPort: 10252 # default to insecure port in k8s < 1.22 - clients: - https: - enabled: false - insecureSkipVerify: false - useServiceAccountCredentials: false - -rkeScheduler: - enabled: false - metricsPort: 10259 - component: kube-scheduler - clients: - https: - enabled: true - insecureSkipVerify: true - useServiceAccountCredentials: true - port: 10012 - useLocalhost: true - nodeSelector: - node-role.kubernetes.io/controlplane: "true" - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - kubeVersionOverrides: - - constraint: "< 1.23" - values: - metricsPort: 10251 # default to insecure port in k8s < 1.23 - clients: - https: - enabled: false - insecureSkipVerify: false - useServiceAccountCredentials: false - -rkeProxy: - enabled: false - metricsPort: 10249 - component: kube-proxy - clients: - port: 10013 - useLocalhost: true - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - -rkeEtcd: - enabled: false - metricsPort: 2379 - component: kube-etcd - clients: - port: 10014 - https: - enabled: true - certDir: /etc/kubernetes/ssl - certFile: kube-etcd-*.pem - keyFile: kube-etcd-*-key.pem - caCertFile: kube-ca.pem - seLinuxOptions: - # Gives rkeEtcd permissions to read files in /etc/kubernetes/* - # Type is defined in https://github.com/rancher/rancher-selinux - type: rke_kubereader_t - nodeSelector: - node-role.kubernetes.io/etcd: "true" - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - -rkeIngressNginx: - enabled: false - metricsPort: 10254 - component: ingress-nginx - clients: - port: 10015 - useLocalhost: true - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - nodeSelector: - node-role.kubernetes.io/worker: "true" - -## k3s PushProx Monitoring -## ref: https://github.com/rancher/charts/tree/dev-v2.5-source/packages/rancher-pushprox -## -k3sServer: - enabled: false - metricsPort: 10250 - component: k3s-server - clients: - port: 10013 - useLocalhost: true - https: - enabled: true - useServiceAccountCredentials: true - insecureSkipVerify: true - rbac: - additionalRules: - - nonResourceURLs: ["/metrics/cadvisor"] - verbs: ["get"] - - apiGroups: [""] - resources: ["nodes/metrics"] - verbs: ["get"] - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - serviceMonitor: - endpoints: - - port: metrics - honorLabels: true - relabelings: - - sourceLabels: [__metrics_path__] - targetLabel: metrics_path - - port: metrics - path: /metrics/cadvisor - honorLabels: true - relabelings: - - sourceLabels: [__metrics_path__] - targetLabel: metrics_path - - port: metrics - path: /metrics/probes - honorLabels: true - relabelings: - - sourceLabels: [__metrics_path__] - targetLabel: metrics_path - -hardened: - k3s: - networkPolicy: - enabled: true - -## KubeADM PushProx Monitoring -## ref: https://github.com/rancher/charts/tree/dev-v2.5-source/packages/rancher-pushprox -## -kubeAdmControllerManager: - enabled: false - metricsPort: 10257 - component: kube-controller-manager - clients: - port: 10011 - useLocalhost: true - https: - enabled: true - useServiceAccountCredentials: true - insecureSkipVerify: true - nodeSelector: - node-role.kubernetes.io/master: "" - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - -kubeAdmScheduler: - enabled: false - metricsPort: 10259 - component: kube-scheduler - clients: - port: 10012 - useLocalhost: true - https: - enabled: true - useServiceAccountCredentials: true - insecureSkipVerify: true - nodeSelector: - node-role.kubernetes.io/master: "" - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - -kubeAdmProxy: - enabled: false - metricsPort: 10249 - component: kube-proxy - clients: - port: 10013 - useLocalhost: true - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - -kubeAdmEtcd: - enabled: false - metricsPort: 2381 - component: kube-etcd - clients: - port: 10014 - useLocalhost: true - nodeSelector: - node-role.kubernetes.io/master: "" - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - -## rke2 PushProx Monitoring -## ref: https://github.com/rancher/charts/tree/dev-v2.5-source/packages/rancher-pushprox -## -rke2ControllerManager: - enabled: false - metricsPort: 10257 # default to secure port as of k8s >= 1.22 - component: kube-controller-manager - clients: - https: - enabled: true - insecureSkipVerify: true - useServiceAccountCredentials: true - port: 10011 - useLocalhost: true - nodeSelector: - node-role.kubernetes.io/master: "true" - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - kubeVersionOverrides: - - constraint: "< 1.22" - values: - metricsPort: 10252 # default to insecure port in k8s < 1.22 - clients: - https: - enabled: false - insecureSkipVerify: false - useServiceAccountCredentials: false - -rke2Scheduler: - enabled: false - metricsPort: 10259 # default to secure port as of k8s >= 1.22 - component: kube-scheduler - clients: - https: - enabled: true - insecureSkipVerify: true - useServiceAccountCredentials: true - port: 10012 - useLocalhost: true - nodeSelector: - node-role.kubernetes.io/master: "true" - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - kubeVersionOverrides: - - constraint: "< 1.22" - values: - metricsPort: 10251 # default to insecure port in k8s < 1.22 - clients: - https: - enabled: false - insecureSkipVerify: false - useServiceAccountCredentials: false - -rke2Proxy: - enabled: false - metricsPort: 10249 - component: kube-proxy - clients: - port: 10013 - useLocalhost: true - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - -rke2Etcd: - enabled: false - metricsPort: 2381 - component: kube-etcd - clients: - port: 10014 - useLocalhost: true - nodeSelector: - node-role.kubernetes.io/etcd: "true" - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - -rke2IngressNginx: - enabled: false - metricsPort: 10254 - component: ingress-nginx - # in the RKE2 cluster, the ingress-nginx-controller is deployed - # as a non-hostNetwork workload starting at the following versions - # - >= v1.22.12+rke2r1 < 1.23.0-0 - # - >= v1.23.9+rke2r1 < 1.24.0-0 - # - >= v1.24.3+rke2r1 < 1.25.0-0 - # - >= v1.25.0+rke2r1 - # As a result we do not need clients and proxies as we can directly create - # a service that targets the workload with the given app name - namespaceOverride: kube-system - clients: - enabled: false - proxy: - enabled: false - service: - selector: - app.kubernetes.io/name: rke2-ingress-nginx - kubeVersionOverrides: - - constraint: "< 1.21.0-0" - values: - namespaceOverride: "" - clients: - enabled: true - port: 10015 - useLocalhost: true - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - affinity: - podAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: "app.kubernetes.io/component" - operator: "In" - values: - - "controller" - topologyKey: "kubernetes.io/hostname" - namespaces: - - "kube-system" - # in the RKE2 cluster, the ingress-nginx-controller is deployed as - # a DaemonSet with 1 pod when RKE2 version is < 1.21.0-0 - deployment: - enabled: false - proxy: - enabled: true - service: - selector: false - - constraint: ">= 1.21.0-0 < 1.22.12-0" - values: - namespaceOverride: "" - clients: - enabled: true - port: 10015 - useLocalhost: true - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - affinity: - podAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: "app.kubernetes.io/component" - operator: "In" - values: - - "controller" - topologyKey: "kubernetes.io/hostname" - namespaces: - - "kube-system" - # in the RKE2 cluster, the ingress-nginx-controller is deployed as - # a hostNetwork Deployment with 1 pod when RKE2 version is >= 1.21.0-0 - deployment: - enabled: true - replicas: 1 - proxy: - enabled: true - service: - selector: false - - constraint: ">= 1.23.0-0 < v1.23.9-0" - values: - namespaceOverride: "" - clients: - enabled: true - port: 10015 - useLocalhost: true - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - affinity: - podAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: "app.kubernetes.io/component" - operator: "In" - values: - - "controller" - topologyKey: "kubernetes.io/hostname" - namespaces: - - "kube-system" - # in the RKE2 cluster, the ingress-nginx-controller is deployed as - # a hostNetwork Deployment with 1 pod when RKE2 version is >= 1.20.0-0 - deployment: - enabled: true - replicas: 1 - proxy: - enabled: true - service: - selector: false - - constraint: ">= 1.24.0-0 < v1.24.3-0" - values: - namespaceOverride: "" - clients: - enabled: true - port: 10015 - useLocalhost: true - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - affinity: - podAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: "app.kubernetes.io/component" - operator: "In" - values: - - "controller" - topologyKey: "kubernetes.io/hostname" - namespaces: - - "kube-system" - # in the RKE2 cluster, the ingress-nginx-controller is deployed as - # a hostNetwork Deployment with 1 pod when RKE2 version is >= 1.20.0-0 - deployment: - enabled: true - replicas: 1 - proxy: - enabled: true - service: - selector: false - - - -## Additional PushProx Monitoring -## ref: https://github.com/rancher/charts/tree/dev-v2.5-source/packages/rancher-pushprox -## - -# hardenedKubelet can only be deployed if kubelet.enabled=true -# If enabled, it replaces the ServiceMonitor deployed by the default kubelet option with a -# PushProx-based exporter that does not require a host port to be open to scrape metrics. -hardenedKubelet: - enabled: false - metricsPort: 10250 - component: kubelet - clients: - port: 10015 - useLocalhost: true - https: - enabled: true - useServiceAccountCredentials: true - insecureSkipVerify: true - rbac: - additionalRules: - - nonResourceURLs: ["/metrics/cadvisor"] - verbs: ["get"] - - apiGroups: [""] - resources: ["nodes/metrics"] - verbs: ["get"] - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - serviceMonitor: - endpoints: - - port: metrics - honorLabels: true - relabelings: - - sourceLabels: [__metrics_path__] - targetLabel: metrics_path - - port: metrics - path: /metrics/cadvisor - honorLabels: true - relabelings: - - sourceLabels: [__metrics_path__] - targetLabel: metrics_path - - port: metrics - path: /metrics/probes - honorLabels: true - relabelings: - - sourceLabels: [__metrics_path__] - targetLabel: metrics_path - -# hardenedNodeExporter can only be deployed if nodeExporter.enabled=true -# If enabled, it replaces the ServiceMonitor deployed by the default nodeExporter with a -# PushProx-based exporter that does not require a host port to be open to scrape metrics. -hardenedNodeExporter: - enabled: false - metricsPort: 9796 - component: node-exporter - clients: - port: 10016 - useLocalhost: true - tolerations: - - effect: "NoExecute" - operator: "Exists" - - effect: "NoSchedule" - operator: "Exists" - -## Upgrades -upgrade: - ## Run upgrade scripts before an upgrade or rollback via a Job hook - enabled: true - ## Image to use to run the scripts - image: - repository: rancher/shell - tag: v0.1.25 - -## Rancher Monitoring -## - -rancherMonitoring: - enabled: true - - ## A namespaceSelector to identify the namespace to find the Rancher deployment - ## - namespaceSelector: - matchNames: - - cattle-system - - ## A selector to identify the Rancher deployment - ## If not set, the chart will try to search for the Rancher deployment in the cattle-system namespace and infer the selector values from it - ## If the Rancher deployment does not exist, no resources will be deployed. - ## - selector: {} - -## Component scraping nginx-ingress-controller -## -ingressNginx: - enabled: false - - ## The namespace to search for your nginx-ingress-controller - ## - namespace: ingress-nginx - - service: - port: 9913 - targetPort: 10254 - # selector: - # app: ingress-nginx - serviceMonitor: - ## Scrape interval. If not set, the Prometheus default scrape interval is used. - ## - interval: "30s" - - ## proxyUrl: URL of a proxy that should be used for scraping. - ## - proxyUrl: "" - - ## metric relabel configs to apply to samples before ingestion. - ## - metricRelabelings: [] - # - action: keep - # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' - # sourceLabels: [__name__] - - # relabel configs to apply to samples before ingestion. - ## - relabelings: [] - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace - -# Prometheus Operator Configuration - -## Provide a name in place of kube-prometheus-stack for `app:` labels -## NOTE: If you change this value, you must update the prometheus-adapter.prometheus.url -## -nameOverride: "rancher-monitoring" - -## Override the deployment namespace -## NOTE: If you change this value, you must update the prometheus-adapter.prometheus.url -## -namespaceOverride: "cattle-monitoring-system" - -## Provide a k8s version to auto dashboard import script example: kubeTargetVersionOverride: 1.16.6 -## -kubeTargetVersionOverride: "" - -## Allow kubeVersion to be overridden while creating the ingress -## -kubeVersionOverride: "" - -## Provide a name to substitute for the full names of resources -## -fullnameOverride: "" - -## Labels to apply to all resources -## -commonLabels: {} -# scmhash: abc123 -# myLabel: aakkmd - -## Create default rules for monitoring the cluster -## -defaultRules: - create: true - rules: - alertmanager: true - etcd: true - configReloaders: true - general: true - k8s: true - kubeApiserverAvailability: true - kubeApiserverBurnrate: true - kubeApiserverHistogram: true - kubeApiserverSlos: true - kubeControllerManager: true - kubelet: true - kubeProxy: true - kubePrometheusGeneral: true - kubePrometheusNodeRecording: true - kubernetesApps: true - kubernetesResources: true - kubernetesStorage: true - kubernetesSystem: true - kubeSchedulerAlerting: true - kubeSchedulerRecording: true - kubeStateMetrics: true - network: true - node: true - nodeExporterAlerting: true - nodeExporterRecording: true - prometheus: true - prometheusOperator: true - - ## Reduce app namespace alert scope - appNamespacesTarget: ".*" - - ## Labels for default rules - labels: {} - ## Annotations for default rules - annotations: {} - - ## Additional labels for PrometheusRule alerts - additionalRuleLabels: {} - - ## Additional annotations for PrometheusRule alerts - additionalRuleAnnotations: {} - - ## Prefix for runbook URLs. Use this to override the first part of the runbookURLs that is common to all rules. - runbookUrl: "https://runbooks.prometheus-operator.dev/runbooks" - - ## Disabled PrometheusRule alerts - disabled: {} - # KubeAPIDown: true - # NodeRAIDDegraded: true - -## Deprecated way to provide custom recording or alerting rules to be deployed into the cluster. -## -# additionalPrometheusRules: [] -# - name: my-rule-file -# groups: -# - name: my_group -# rules: -# - record: my_record -# expr: 100 * my_record - -## Provide custom recording or alerting rules to be deployed into the cluster. -## -additionalPrometheusRulesMap: {} -# rule-name: -# groups: -# - name: my_group -# rules: -# - record: my_record -# expr: 100 * my_record - -## -global: - cattle: - psp: - enabled: false - - systemDefaultRegistry: "" - ## Windows Monitoring - ## ref: https://github.com/rancher/charts/tree/dev-v2.5-source/packages/rancher-windows-exporter - ## - ## Deploys a DaemonSet of Prometheus exporters based on https://github.com/prometheus-community/windows_exporter. - ## Every Windows host must have a wins version of 0.1.0+ to use this chart (default as of Rancher 2.5.8). - ## To upgrade wins versions on Windows hosts, see https://github.com/rancher/wins/tree/master/charts/rancher-wins-upgrader. - ## - windows: - enabled: false - seLinux: - enabled: false - kubectl: - repository: rancher/kubectl - tag: v1.20.2 - pullPolicy: IfNotPresent - rbac: - ## Create RBAC resources for ServiceAccounts and users - ## - create: true - - userRoles: - ## Create default user ClusterRoles to allow users to interact with Prometheus CRs, ConfigMaps, and Secrets - create: true - ## Aggregate default user ClusterRoles into default k8s ClusterRoles - aggregateToDefaultRoles: true - - pspAnnotations: {} - ## Specify pod annotations - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#apparmor - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#sysctl - ## - # seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*' - # seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' - # apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' - - ## Global image registry to use if it needs to be overriden for some specific use cases (e.g local registries, custom images, ...) - ## - imageRegistry: docker.io - - ## Reference to one or more secrets to be used when pulling images - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - ## - imagePullSecrets: [] - # - name: "image-pull-secret" - # or - # - "image-pull-secret" - -## Configuration for alertmanager -## ref: https://prometheus.io/docs/alerting/alertmanager/ -## -alertmanager: - - ## Deploy alertmanager - ## - enabled: true - - ## Annotations for Alertmanager - ## - annotations: {} - - ## Api that prometheus will use to communicate with alertmanager. Possible values are v1, v2 - ## - apiVersion: v2 - - ## Service account for Alertmanager to use. - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/ - ## - serviceAccount: - create: true - name: "" - annotations: {} - automountServiceAccountToken: true - - ## Configure pod disruption budgets for Alertmanager - ## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget - ## This configuration is immutable once created and will require the PDB to be deleted to be changed - ## https://github.com/kubernetes/kubernetes/issues/45398 - ## - podDisruptionBudget: - enabled: false - minAvailable: 1 - maxUnavailable: "" - - ## Alertmanager configuration directives - ## ref: https://prometheus.io/docs/alerting/configuration/#configuration-file - ## https://prometheus.io/webtools/alerting/routing-tree-editor/ - ## - config: - global: - resolve_timeout: 5m - inhibit_rules: - - source_matchers: - - 'severity = critical' - target_matchers: - - 'severity =~ warning|info' - equal: - - 'namespace' - - 'alertname' - - source_matchers: - - 'severity = warning' - target_matchers: - - 'severity = info' - equal: - - 'namespace' - - 'alertname' - - source_matchers: - - 'alertname = InfoInhibitor' - target_matchers: - - 'severity = info' - equal: - - 'namespace' - route: - group_by: ['namespace'] - group_wait: 30s - group_interval: 5m - repeat_interval: 12h - receiver: 'null' - routes: - - receiver: 'null' - matchers: - - alertname =~ "InfoInhibitor|Watchdog" - receivers: - - name: 'null' - templates: - - '/etc/alertmanager/config/*.tmpl' - - ## Alertmanager configuration directives (as string type, preferred over the config hash map) - ## stringConfig will be used only, if tplConfig is true - ## ref: https://prometheus.io/docs/alerting/configuration/#configuration-file - ## https://prometheus.io/webtools/alerting/routing-tree-editor/ - ## - stringConfig: "" - - ## Pass the Alertmanager configuration directives through Helm's templating - ## engine. If the Alertmanager configuration contains Alertmanager templates, - ## they'll need to be properly escaped so that they are not interpreted by - ## Helm - ## ref: https://helm.sh/docs/developing_charts/#using-the-tpl-function - ## https://prometheus.io/docs/alerting/configuration/#tmpl_string - ## https://prometheus.io/docs/alerting/notifications/ - ## https://prometheus.io/docs/alerting/notification_examples/ - tplConfig: false - - ## Alertmanager template files to format alerts - ## By default, templateFiles are placed in /etc/alertmanager/config/ and if - ## they have a .tmpl file suffix will be loaded. See config.templates above - ## to change, add other suffixes. If adding other suffixes, be sure to update - ## config.templates above to include those suffixes. - ## ref: https://prometheus.io/docs/alerting/notifications/ - ## https://prometheus.io/docs/alerting/notification_examples/ - ## - - templateFiles: - rancher_defaults.tmpl: |- - {{- define "slack.rancher.text" -}} - {{ template "rancher.text_multiple" . }} - {{- end -}} - - {{- define "rancher.text_multiple" -}} - *[GROUP - Details]* - One or more alarms in this group have triggered a notification. - - {{- if gt (len .GroupLabels.Values) 0 }} - *Group Labels:* - {{- range .GroupLabels.SortedPairs }} - • *{{ .Name }}:* `{{ .Value }}` - {{- end }} - {{- end }} - {{- if .ExternalURL }} - *Link to AlertManager:* {{ .ExternalURL }} - {{- end }} - - {{- range .Alerts }} - {{ template "rancher.text_single" . }} - {{- end }} - {{- end -}} - - {{- define "rancher.text_single" -}} - {{- if .Labels.alertname }} - *[ALERT - {{ .Labels.alertname }}]* - {{- else }} - *[ALERT]* - {{- end }} - {{- if .Labels.severity }} - *Severity:* `{{ .Labels.severity }}` - {{- end }} - {{- if .Labels.cluster }} - *Cluster:* {{ .Labels.cluster }} - {{- end }} - {{- if .Annotations.summary }} - *Summary:* {{ .Annotations.summary }} - {{- end }} - {{- if .Annotations.message }} - *Message:* {{ .Annotations.message }} - {{- end }} - {{- if .Annotations.description }} - *Description:* {{ .Annotations.description }} - {{- end }} - {{- if .Annotations.runbook_url }} - *Runbook URL:* <{{ .Annotations.runbook_url }}|:spiral_note_pad:> - {{- end }} - {{- with .Labels }} - {{- with .Remove (stringSlice "alertname" "severity" "cluster") }} - {{- if gt (len .) 0 }} - *Additional Labels:* - {{- range .SortedPairs }} - • *{{ .Name }}:* `{{ .Value }}` - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- with .Annotations }} - {{- with .Remove (stringSlice "summary" "message" "description" "runbook_url") }} - {{- if gt (len .) 0 }} - *Additional Annotations:* - {{- range .SortedPairs }} - • *{{ .Name }}:* `{{ .Value }}` - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- end -}} - - ingress: - enabled: false - - # For Kubernetes >= 1.18 you should specify the ingress-controller via the field ingressClassName - # See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#specifying-the-class-of-an-ingress - # ingressClassName: nginx - - annotations: {} - - labels: {} - - ## Override ingress to a different defined port on the service - # servicePort: 8081 - ## Override ingress to a different service then the default, this is useful if you need to - ## point to a specific instance of the alertmanager (eg kube-prometheus-stack-alertmanager-0) - # serviceName: kube-prometheus-stack-alertmanager-0 - - ## Hosts must be provided if Ingress is enabled. - ## - hosts: [] - # - alertmanager.domain.com - - ## Paths to use for ingress rules - one path should match the alertmanagerSpec.routePrefix - ## - paths: [] - # - / - - ## For Kubernetes >= 1.18 you should specify the pathType (determines how Ingress paths should be matched) - ## See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#better-path-matching-with-path-types - # pathType: ImplementationSpecific - - ## TLS configuration for Alertmanager Ingress - ## Secret must be manually created in the namespace - ## - tls: [] - # - secretName: alertmanager-general-tls - # hosts: - # - alertmanager.example.com - - ## Configuration for Alertmanager secret - ## - secret: - annotations: {} - - ## Configuration for creating an Ingress that will map to each Alertmanager replica service - ## alertmanager.servicePerReplica must be enabled - ## - ingressPerReplica: - enabled: false - - # For Kubernetes >= 1.18 you should specify the ingress-controller via the field ingressClassName - # See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#specifying-the-class-of-an-ingress - # ingressClassName: nginx - - annotations: {} - labels: {} - - ## Final form of the hostname for each per replica ingress is - ## {{ ingressPerReplica.hostPrefix }}-{{ $replicaNumber }}.{{ ingressPerReplica.hostDomain }} - ## - ## Prefix for the per replica ingress that will have `-$replicaNumber` - ## appended to the end - hostPrefix: "" - ## Domain that will be used for the per replica ingress - hostDomain: "" - - ## Paths to use for ingress rules - ## - paths: [] - # - / - - ## For Kubernetes >= 1.18 you should specify the pathType (determines how Ingress paths should be matched) - ## See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#better-path-matching-with-path-types - # pathType: ImplementationSpecific - - ## Secret name containing the TLS certificate for alertmanager per replica ingress - ## Secret must be manually created in the namespace - tlsSecretName: "" - - ## Separated secret for each per replica Ingress. Can be used together with cert-manager - ## - tlsSecretPerReplica: - enabled: false - ## Final form of the secret for each per replica ingress is - ## {{ tlsSecretPerReplica.prefix }}-{{ $replicaNumber }} - ## - prefix: "alertmanager" - - ## Configuration for Alertmanager service - ## - service: - annotations: {} - labels: {} - clusterIP: "" - - ## Port for Alertmanager Service to listen on - ## - port: 9093 - ## To be used with a proxy extraContainer port - ## - targetPort: 9093 - ## Port to expose on each node - ## Only used if service.type is 'NodePort' - ## - nodePort: 30903 - ## List of IP addresses at which the Prometheus server service is available - ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips - ## - - ## Additional ports to open for Alertmanager service - additionalPorts: [] - # additionalPorts: - # - name: authenticated - # port: 8081 - # targetPort: 8081 - - externalIPs: [] - loadBalancerIP: "" - loadBalancerSourceRanges: [] - - ## Denotes if this Service desires to route external traffic to node-local or cluster-wide endpoints - ## - externalTrafficPolicy: Cluster - - ## If you want to make sure that connections from a particular client are passed to the same Pod each time - ## Accepts 'ClientIP' or '' - ## - sessionAffinity: "" - - ## Service type - ## - type: ClusterIP - - ## Configuration for creating a separate Service for each statefulset Alertmanager replica - ## - servicePerReplica: - enabled: false - annotations: {} - - ## Port for Alertmanager Service per replica to listen on - ## - port: 9093 - - ## To be used with a proxy extraContainer port - targetPort: 9093 - - ## Port to expose on each node - ## Only used if servicePerReplica.type is 'NodePort' - ## - nodePort: 30904 - - ## Loadbalancer source IP ranges - ## Only used if servicePerReplica.type is "LoadBalancer" - loadBalancerSourceRanges: [] - - ## Denotes if this Service desires to route external traffic to node-local or cluster-wide endpoints - ## - externalTrafficPolicy: Cluster - - ## Service type - ## - type: ClusterIP - - ## If true, create a serviceMonitor for alertmanager - ## - serviceMonitor: - ## Scrape interval. If not set, the Prometheus default scrape interval is used. - ## - interval: "" - selfMonitor: true - - ## Additional labels - ## - additionalLabels: {} - - ## SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. - ## - sampleLimit: 0 - - ## TargetLimit defines a limit on the number of scraped targets that will be accepted. - ## - targetLimit: 0 - - ## Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelLimit: 0 - - ## Per-scrape limit on length of labels name that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelNameLengthLimit: 0 - - ## Per-scrape limit on length of labels value that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelValueLengthLimit: 0 - - ## proxyUrl: URL of a proxy that should be used for scraping. - ## - proxyUrl: "" - - ## scheme: HTTP scheme to use for scraping. Can be used with `tlsConfig` for example if using istio mTLS. - scheme: "" - - ## enableHttp2: Whether to enable HTTP2. - ## See https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#endpoint - enableHttp2: true - - ## tlsConfig: TLS configuration to use when scraping the endpoint. For example if using istio mTLS. - ## Of type: https://github.com/coreos/prometheus-operator/blob/main/Documentation/api.md#tlsconfig - tlsConfig: {} - - bearerTokenFile: - - ## MetricRelabelConfigs to apply to samples after scraping, but before ingestion. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - metricRelabelings: [] - # - action: keep - # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' - # sourceLabels: [__name__] - - ## RelabelConfigs to apply to samples before scraping - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - relabelings: [] - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace - - ## Settings affecting alertmanagerSpec - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#alertmanagerspec - ## - alertmanagerSpec: - ## Standard object's metadata. More info: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#metadata - ## Metadata Labels and Annotations gets propagated to the Alertmanager pods. - ## - podMetadata: {} - - ## Image of Alertmanager - ## - image: - repository: rancher/mirrored-prometheus-alertmanager - tag: v0.26.0 - sha: "" - - ## If true then the user will be responsible to provide a secret with alertmanager configuration - ## So when true the config part will be ignored (including templateFiles) and the one in the secret will be used - ## - useExistingSecret: false - - ## Secrets is a list of Secrets in the same namespace as the Alertmanager object, which shall be mounted into the - ## Alertmanager Pods. The Secrets are mounted into /etc/alertmanager/secrets/. - ## - secrets: [] - - ## ConfigMaps is a list of ConfigMaps in the same namespace as the Alertmanager object, which shall be mounted into the Alertmanager Pods. - ## The ConfigMaps are mounted into /etc/alertmanager/configmaps/. - ## - configMaps: [] - - ## ConfigSecret is the name of a Kubernetes Secret in the same namespace as the Alertmanager object, which contains configuration for - ## this Alertmanager instance. Defaults to 'alertmanager-' The secret is mounted into /etc/alertmanager/config. - ## - # configSecret: - - ## WebTLSConfig defines the TLS parameters for HTTPS - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#alertmanagerwebspec - web: {} - - ## AlertmanagerConfigs to be selected to merge and configure Alertmanager with. - ## - alertmanagerConfigSelector: {} - ## Example which selects all alertmanagerConfig resources - ## with label "alertconfig" with values any of "example-config" or "example-config-2" - # alertmanagerConfigSelector: - # matchExpressions: - # - key: alertconfig - # operator: In - # values: - # - example-config - # - example-config-2 - # - ## Example which selects all alertmanagerConfig resources with label "role" set to "example-config" - # alertmanagerConfigSelector: - # matchLabels: - # role: example-config - - ## Namespaces to be selected for AlertmanagerConfig discovery. If nil, only check own namespace. - ## - alertmanagerConfigNamespaceSelector: {} - ## Example which selects all namespaces - ## with label "alertmanagerconfig" with values any of "example-namespace" or "example-namespace-2" - # alertmanagerConfigNamespaceSelector: - # matchExpressions: - # - key: alertmanagerconfig - # operator: In - # values: - # - example-namespace - # - example-namespace-2 - - ## Example which selects all namespaces with label "alertmanagerconfig" set to "enabled" - # alertmanagerConfigNamespaceSelector: - # matchLabels: - # alertmanagerconfig: enabled - - ## AlermanagerConfig to be used as top level configuration - ## - alertmanagerConfiguration: {} - ## Example with select a global alertmanagerconfig - # alertmanagerConfiguration: - # name: global-alertmanager-Configuration - - ## Defines the strategy used by AlertmanagerConfig objects to match alerts. eg: - ## - alertmanagerConfigMatcherStrategy: {} - ## Example with use OnNamespace strategy - # alertmanagerConfigMatcherStrategy: - # type: OnNamespace - - ## Define Log Format - # Use logfmt (default) or json logging - logFormat: logfmt - - ## Log level for Alertmanager to be configured with. - ## - logLevel: info - - ## Size is the expected size of the alertmanager cluster. The controller will eventually make the size of the - ## running cluster equal to the expected size. - replicas: 1 - - ## Time duration Alertmanager shall retain data for. Default is '120h', and must match the regular expression - ## [0-9]+(ms|s|m|h) (milliseconds seconds minutes hours). - ## - retention: 120h - - ## Storage is the definition of how storage will be used by the Alertmanager instances. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/storage.md - ## - storage: {} - # volumeClaimTemplate: - # spec: - # storageClassName: gluster - # accessModes: ["ReadWriteOnce"] - # resources: - # requests: - # storage: 50Gi - # selector: {} - - - ## The external URL the Alertmanager instances will be available under. This is necessary to generate correct URLs. This is necessary if Alertmanager is not served from root of a DNS name. string false - ## - externalUrl: - - ## The route prefix Alertmanager registers HTTP handlers for. This is useful, if using ExternalURL and a proxy is rewriting HTTP routes of a request, and the actual ExternalURL is still true, - ## but the server serves requests under a different route prefix. For example for use with kubectl proxy. - ## - routePrefix: / - - ## If set to true all actions on the underlying managed objects are not going to be performed, except for delete actions. - ## - paused: false - - ## Define which Nodes the Pods are scheduled on. - ## ref: https://kubernetes.io/docs/user-guide/node-selection/ - ## - nodeSelector: {} - - ## Define resources requests and limits for single Pods. - ## ref: https://kubernetes.io/docs/user-guide/compute-resources/ - ## - resources: - limits: - memory: 500Mi - cpu: 1000m - requests: - memory: 100Mi - cpu: 100m - - ## Pod anti-affinity can prevent the scheduler from placing Prometheus replicas on the same node. - ## The default value "soft" means that the scheduler should *prefer* to not schedule two replica pods onto the same node but no guarantee is provided. - ## The value "hard" means that the scheduler is *required* to not schedule two replica pods onto the same node. - ## The value "" will disable pod anti-affinity so that no anti-affinity rules will be configured. - ## - podAntiAffinity: "" - - ## If anti-affinity is enabled sets the topologyKey to use for anti-affinity. - ## This can be changed to, for example, failure-domain.beta.kubernetes.io/zone - ## - podAntiAffinityTopologyKey: kubernetes.io/hostname - - ## Assign custom affinity rules to the alertmanager instance - ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - ## - affinity: {} - # nodeAffinity: - # requiredDuringSchedulingIgnoredDuringExecution: - # nodeSelectorTerms: - # - matchExpressions: - # - key: kubernetes.io/e2e-az-name - # operator: In - # values: - # - e2e-az1 - # - e2e-az2 - - ## If specified, the pod's tolerations. - ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - ## - tolerations: [] - # - key: "key" - # operator: "Equal" - # value: "value" - # effect: "NoSchedule" - - ## If specified, the pod's topology spread constraints. - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ - ## - topologySpreadConstraints: [] - # - maxSkew: 1 - # topologyKey: topology.kubernetes.io/zone - # whenUnsatisfiable: DoNotSchedule - # labelSelector: - # matchLabels: - # app: alertmanager - - ## SecurityContext holds pod-level security attributes and common container settings. - ## This defaults to non root user with uid 1000 and gid 2000. *v1.PodSecurityContext false - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ - ## - securityContext: - runAsGroup: 2000 - runAsNonRoot: true - runAsUser: 1000 - fsGroup: 2000 - - ## ListenLocal makes the Alertmanager server listen on loopback, so that it does not bind against the Pod IP. - ## Note this is only for the Alertmanager UI, not the gossip communication. - ## - listenLocal: false - - ## Containers allows injecting additional containers. This is meant to allow adding an authentication proxy to an Alertmanager pod. - ## - containers: [] - # containers: - # - name: oauth-proxy - # image: quay.io/oauth2-proxy/oauth2-proxy:v7.3.0 - # args: - # - --upstream=http://127.0.0.1:9093 - # - --http-address=0.0.0.0:8081 - # - ... - # ports: - # - containerPort: 8081 - # name: oauth-proxy - # protocol: TCP - # resources: {} - - # Additional volumes on the output StatefulSet definition. - volumes: [] - - # Additional VolumeMounts on the output StatefulSet definition. - volumeMounts: [] - - ## InitContainers allows injecting additional initContainers. This is meant to allow doing some changes - ## (permissions, dir tree) on mounted volumes before starting prometheus - initContainers: [] - - ## Priority class assigned to the Pods - ## - priorityClassName: "" - - ## AdditionalPeers allows injecting a set of additional Alertmanagers to peer with to form a highly available cluster. - ## - additionalPeers: [] - - ## PortName to use for Alert Manager. - ## - portName: "http-web" - - ## ClusterAdvertiseAddress is the explicit address to advertise in cluster. Needs to be provided for non RFC1918 [1] (public) addresses. [1] RFC1918: https://tools.ietf.org/html/rfc1918 - ## - clusterAdvertiseAddress: false - - ## ForceEnableClusterMode ensures Alertmanager does not deactivate the cluster mode when running with a single replica. - ## Use case is e.g. spanning an Alertmanager cluster across Kubernetes clusters with a single replica in each. - forceEnableClusterMode: false - - ## Minimum number of seconds for which a newly created pod should be ready without any of its container crashing for it to - ## be considered available. Defaults to 0 (pod will be considered available as soon as it is ready). - minReadySeconds: 0 - - ## ExtraSecret can be used to store various data in an extra secret - ## (use it for example to store hashed basic auth credentials) - extraSecret: - ## if not set, name will be auto generated - # name: "" - annotations: {} - data: {} - # auth: | - # foo:$apr1$OFG3Xybp$ckL0FHDAkoXYIlH9.cysT0 - # someoneelse:$apr1$DMZX2Z4q$6SbQIfyuLQd.xmo/P0m2c. - -## Using default values from https://github.com/grafana/helm-charts/blob/main/charts/grafana/values.yaml -## -grafana: - enabled: true - namespaceOverride: "" - - ## Grafana's primary configuration - ## NOTE: values in map will be converted to ini format - ## ref: http://docs.grafana.org/installation/configuration/ - ## - grafana.ini: - users: - auto_assign_org_role: Viewer - auth: - disable_login_form: false - auth.anonymous: - enabled: true - org_role: Viewer - auth.basic: - enabled: false - dashboards: - # Modify this value to change the default dashboard shown on the main Grafana page - default_home_dashboard_path: /tmp/dashboards/rancher-default-home.json - security: - # Required to embed dashboards in Rancher Cluster Overview Dashboard on Cluster Explorer - allow_embedding: true - - deploymentStrategy: - type: Recreate - - ## ForceDeployDatasources Create datasource configmap even if grafana deployment has been disabled - ## - forceDeployDatasources: false - - ## ForceDeployDashboard Create dashboard configmap even if grafana deployment has been disabled - ## - forceDeployDashboards: false - - ## Deploy default dashboards - ## - defaultDashboardsEnabled: true - - # Additional options for defaultDashboards - defaultDashboards: - # The default namespace to place defaultDashboards within - namespace: cattle-dashboards - # Whether to create the default namespace as a Helm managed namespace or use an existing namespace - # If false, the defaultDashboards.namespace will be created as a Helm managed namespace - useExistingNamespace: false - # Whether the Helm managed namespace created by this chart should be left behind on a Helm uninstall - # If you place other dashboards in this namespace, then they will be deleted on a helm uninstall - # Ignore if useExistingNamespace is true - cleanupOnUninstall: false - - ## Timezone for the default dashboards - ## Other options are: browser or a specific timezone, i.e. Europe/Luxembourg - ## - defaultDashboardsTimezone: utc - - adminPassword: prom-operator - - ingress: - ## If true, Grafana Ingress will be created - ## - enabled: false - - ## IngressClassName for Grafana Ingress. - ## Should be provided if Ingress is enable. - ## - # ingressClassName: nginx - - ## Annotations for Grafana Ingress - ## - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - - ## Labels to be added to the Ingress - ## - labels: {} - - ## Hostnames. - ## Must be provided if Ingress is enable. - ## - # hosts: - # - grafana.domain.com - hosts: [] - - ## Path for grafana ingress - path: / - - ## TLS configuration for grafana Ingress - ## Secret must be manually created in the namespace - ## - tls: [] - # - secretName: grafana-general-tls - # hosts: - # - grafana.example.com - - sidecar: - dashboards: - enabled: true - label: grafana_dashboard - searchNamespace: cattle-dashboards - labelValue: "1" - # Allow discovery in all namespaces for dashboards - searchNamespace: ALL - - ## Annotations for Grafana dashboard configmaps - ## - annotations: {} - multicluster: - global: - enabled: false - etcd: - enabled: false - provider: - allowUiUpdates: false - datasources: - enabled: true - defaultDatasourceEnabled: true - isDefaultDatasource: true - - uid: prometheus - - ## URL of prometheus datasource - ## - # url: http://prometheus-stack-prometheus:9090/ - - ## Prometheus request timeout in seconds - # timeout: 30 - - # If not defined, will use prometheus.prometheusSpec.scrapeInterval or its default - # defaultDatasourceScrapeInterval: 15s - - ## Annotations for Grafana datasource configmaps - ## - annotations: {} - - ## Set method for HTTP to send query to datasource - httpMethod: POST - - ## Create datasource for each Pod of Prometheus StatefulSet; - ## this uses headless service `prometheus-operated` which is - ## created by Prometheus Operator - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/0fee93e12dc7c2ea1218f19ae25ec6b893460590/pkg/prometheus/statefulset.go#L255-L286 - createPrometheusReplicasDatasources: false - label: grafana_datasource - labelValue: "1" - - ## Field with internal link pointing to existing data source in Grafana. - ## Can be provisioned via additionalDataSources - exemplarTraceIdDestinations: {} - # datasourceUid: Jaeger - # traceIdLabelName: trace_id - - extraConfigmapMounts: [] - # - name: certs-configmap - # mountPath: /etc/grafana/ssl/ - # configMap: certs-configmap - # readOnly: true - - deleteDatasources: [] - # - name: example-datasource - # orgId: 1 - - ## Configure additional grafana datasources (passed through tpl) - ## ref: http://docs.grafana.org/administration/provisioning/#datasources - additionalDataSources: [] - # - name: prometheus-sample - # access: proxy - # basicAuth: true - # basicAuthPassword: pass - # basicAuthUser: daco - # editable: false - # jsonData: - # tlsSkipVerify: true - # orgId: 1 - # type: prometheus - # url: https://{{ printf "%s-prometheus.svc" .Release.Name }}:9090 - # version: 1 - - ## Passed to grafana subchart and used by servicemonitor below - ## - service: - portName: nginx-http - ## Port for Grafana Service to listen on - ## - port: 80 - ## To be used with a proxy extraContainer port - ## - targetPort: 8080 - ## Port to expose on each node - ## Only used if service.type is 'NodePort' - ## - nodePort: 30950 - ## Service type - ## - type: ClusterIP - - proxy: - image: - repository: rancher/mirrored-library-nginx - tag: 1.24.0-alpine - - ## Enable an Specify container in extraContainers. This is meant to allow adding an authentication proxy to a grafana pod - extraContainers: | - - name: grafana-proxy - args: - - nginx - - -g - - daemon off; - - -c - - /nginx/nginx.conf - image: "{{ template "system_default_registry" . }}{{ .Values.proxy.image.repository }}:{{ .Values.proxy.image.tag }}" - ports: - - containerPort: 8080 - name: nginx-http - protocol: TCP - volumeMounts: - - mountPath: /nginx - name: grafana-nginx - - mountPath: /var/cache/nginx - name: nginx-home - securityContext: - runAsUser: 101 - runAsGroup: 101 - - ## Volumes that can be used in containers - extraContainerVolumes: - - name: nginx-home - emptyDir: {} - - name: grafana-nginx - configMap: - name: grafana-nginx-proxy-config - items: - - key: nginx.conf - mode: 438 - path: nginx.conf - - ## If true, create a serviceMonitor for grafana - ## - serviceMonitor: - # If true, a ServiceMonitor CRD is created for a prometheus operator - # https://github.com/coreos/prometheus-operator - # - enabled: true - - # Path to use for scraping metrics. Might be different if server.root_url is set - # in grafana.ini - path: "/metrics" - - # namespace: monitoring (defaults to use the namespace this chart is deployed to) - - # labels for the ServiceMonitor - labels: {} - - # Scrape interval. If not set, the Prometheus default scrape interval is used. - # - interval: "" - scheme: http - tlsConfig: {} - scrapeTimeout: 30s - - ## RelabelConfigs to apply to samples before scraping - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - relabelings: [] - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace - - resources: - limits: - memory: 200Mi - cpu: 200m - requests: - memory: 100Mi - cpu: 100m - - testFramework: - enabled: false - -## Flag to disable all the kubernetes component scrapers -## -kubernetesServiceMonitors: - enabled: true - -## Component scraping the kube api server -## -kubeApiServer: - enabled: true - tlsConfig: - serverName: kubernetes - insecureSkipVerify: false - serviceMonitor: - ## Scrape interval. If not set, the Prometheus default scrape interval is used. - ## - interval: "" - - ## SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. - ## - sampleLimit: 0 - - ## TargetLimit defines a limit on the number of scraped targets that will be accepted. - ## - targetLimit: 0 - - ## Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelLimit: 0 - - ## Per-scrape limit on length of labels name that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelNameLengthLimit: 0 - - ## Per-scrape limit on length of labels value that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelValueLengthLimit: 0 - - ## proxyUrl: URL of a proxy that should be used for scraping. - ## - proxyUrl: "" - - jobLabel: component - selector: - matchLabels: - component: apiserver - provider: kubernetes - - ## MetricRelabelConfigs to apply to samples after scraping, but before ingestion. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - metricRelabelings: - # Drop excessively noisy apiserver buckets. - - action: drop - regex: apiserver_request_duration_seconds_bucket;(0.15|0.2|0.3|0.35|0.4|0.45|0.6|0.7|0.8|0.9|1.25|1.5|1.75|2|3|3.5|4|4.5|6|7|8|9|15|25|40|50) - sourceLabels: - - __name__ - - le - # - action: keep - # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' - # sourceLabels: [__name__] - - ## RelabelConfigs to apply to samples before scraping - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - relabelings: [] - # - sourceLabels: - # - __meta_kubernetes_namespace - # - __meta_kubernetes_service_name - # - __meta_kubernetes_endpoint_port_name - # action: keep - # regex: default;kubernetes;https - # - targetLabel: __address__ - # replacement: kubernetes.default.svc:443 - - ## Additional labels - ## - additionalLabels: {} - # foo: bar - -## Component scraping the kubelet and kubelet-hosted cAdvisor -## -kubelet: - enabled: true - namespace: kube-system - - serviceMonitor: - ## Scrape interval. If not set, the Prometheus default scrape interval is used. - ## - interval: "" - - ## SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. - ## - sampleLimit: 0 - - ## TargetLimit defines a limit on the number of scraped targets that will be accepted. - ## - targetLimit: 0 - - ## Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelLimit: 0 - - ## Per-scrape limit on length of labels name that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelNameLengthLimit: 0 - - ## Per-scrape limit on length of labels value that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelValueLengthLimit: 0 - - ## proxyUrl: URL of a proxy that should be used for scraping. - ## - proxyUrl: "" - - ## Enable scraping the kubelet over https. For requirements to enable this see - ## https://github.com/prometheus-operator/prometheus-operator/issues/926 - ## - https: true - - ## Enable scraping /metrics/cadvisor from kubelet's service - ## - cAdvisor: true - - ## Enable scraping /metrics/probes from kubelet's service - ## - probes: true - - ## Enable scraping /metrics/resource from kubelet's service - ## This is disabled by default because container metrics are already exposed by cAdvisor - ## - resource: false - # From kubernetes 1.18, /metrics/resource/v1alpha1 renamed to /metrics/resource - resourcePath: "/metrics/resource/v1alpha1" - - ## MetricRelabelConfigs to apply to samples after scraping, but before ingestion. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - cAdvisorMetricRelabelings: - # Drop less useful container CPU metrics. - - sourceLabels: [__name__] - action: drop - regex: 'container_cpu_(cfs_throttled_seconds_total|load_average_10s|system_seconds_total|user_seconds_total)' - # Drop less useful container / always zero filesystem metrics. - - sourceLabels: [__name__] - action: drop - regex: 'container_fs_(io_current|io_time_seconds_total|io_time_weighted_seconds_total|reads_merged_total|sector_reads_total|sector_writes_total|writes_merged_total)' - # Drop less useful / always zero container memory metrics. - - sourceLabels: [__name__] - action: drop - regex: 'container_memory_(mapped_file|swap)' - # Drop less useful container process metrics. - - sourceLabels: [__name__] - action: drop - regex: 'container_(file_descriptors|tasks_state|threads_max)' - # Drop container spec metrics that overlap with kube-state-metrics. - - sourceLabels: [__name__] - action: drop - regex: 'container_spec.*' - # Drop cgroup metrics with no pod. - - sourceLabels: [id, pod] - action: drop - regex: '.+;' - # - sourceLabels: [__name__, image] - # separator: ; - # regex: container_([a-z_]+); - # replacement: $1 - # action: drop - # - sourceLabels: [__name__] - # separator: ; - # regex: container_(network_tcp_usage_total|network_udp_usage_total|tasks_state|cpu_load_average_10s) - # replacement: $1 - # action: drop - - ## MetricRelabelConfigs to apply to samples after scraping, but before ingestion. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - probesMetricRelabelings: [] - # - sourceLabels: [__name__, image] - # separator: ; - # regex: container_([a-z_]+); - # replacement: $1 - # action: drop - # - sourceLabels: [__name__] - # separator: ; - # regex: container_(network_tcp_usage_total|network_udp_usage_total|tasks_state|cpu_load_average_10s) - # replacement: $1 - # action: drop - - ## RelabelConfigs to apply to samples before scraping - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - ## metrics_path is required to match upstream rules and charts - cAdvisorRelabelings: - - action: replace - sourceLabels: [__metrics_path__] - targetLabel: metrics_path - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace - - ## RelabelConfigs to apply to samples before scraping - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - probesRelabelings: - - action: replace - sourceLabels: [__metrics_path__] - targetLabel: metrics_path - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace - - ## RelabelConfigs to apply to samples before scraping - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - resourceRelabelings: - - action: replace - sourceLabels: [__metrics_path__] - targetLabel: metrics_path - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace - - ## MetricRelabelConfigs to apply to samples after scraping, but before ingestion. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - metricRelabelings: [] - # - sourceLabels: [__name__, image] - # separator: ; - # regex: container_([a-z_]+); - # replacement: $1 - # action: drop - # - sourceLabels: [__name__] - # separator: ; - # regex: container_(network_tcp_usage_total|network_udp_usage_total|tasks_state|cpu_load_average_10s) - # replacement: $1 - # action: drop - - ## RelabelConfigs to apply to samples before scraping - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - ## metrics_path is required to match upstream rules and charts - relabelings: - - action: replace - sourceLabels: [__metrics_path__] - targetLabel: metrics_path - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace - - ## Additional labels - ## - additionalLabels: {} - # foo: bar - -## Component scraping the kube controller manager -## -kubeControllerManager: - enabled: false - - ## If your kube controller manager is not deployed as a pod, specify IPs it can be found on - ## - endpoints: [] - # - 10.141.4.22 - # - 10.141.4.23 - # - 10.141.4.24 - - ## If using kubeControllerManager.endpoints only the port and targetPort are used - ## - service: - enabled: true - ## If null or unset, the value is determined dynamically based on target Kubernetes version due to change - ## of default port in Kubernetes 1.22. - ## - port: null - targetPort: null - # selector: - # component: kube-controller-manager - - serviceMonitor: - enabled: true - ## Scrape interval. If not set, the Prometheus default scrape interval is used. - ## - interval: "" - - ## SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. - ## - sampleLimit: 0 - - ## TargetLimit defines a limit on the number of scraped targets that will be accepted. - ## - targetLimit: 0 - - ## Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelLimit: 0 - - ## Per-scrape limit on length of labels name that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelNameLengthLimit: 0 - - ## Per-scrape limit on length of labels value that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelValueLengthLimit: 0 - - ## proxyUrl: URL of a proxy that should be used for scraping. - ## - proxyUrl: "" - - ## Enable scraping kube-controller-manager over https. - ## Requires proper certs (not self-signed) and delegated authentication/authorization checks. - ## If null or unset, the value is determined dynamically based on target Kubernetes version. - ## - https: null - - # Skip TLS certificate validation when scraping - insecureSkipVerify: null - - # Name of the server to use when validating TLS certificate - serverName: null - - ## MetricRelabelConfigs to apply to samples after scraping, but before ingestion. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - metricRelabelings: [] - # - action: keep - # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' - # sourceLabels: [__name__] - - ## RelabelConfigs to apply to samples before scraping - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - relabelings: [] - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace - - ## Additional labels - ## - additionalLabels: {} - # foo: bar - -## Component scraping coreDns. Use either this or kubeDns -## -coreDns: - enabled: true - service: - port: 9153 - targetPort: 9153 - # selector: - # k8s-app: kube-dns - serviceMonitor: - ## Scrape interval. If not set, the Prometheus default scrape interval is used. - ## - interval: "" - - ## SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. - ## - sampleLimit: 0 - - ## TargetLimit defines a limit on the number of scraped targets that will be accepted. - ## - targetLimit: 0 - - ## Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelLimit: 0 - - ## Per-scrape limit on length of labels name that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelNameLengthLimit: 0 - - ## Per-scrape limit on length of labels value that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelValueLengthLimit: 0 - - ## proxyUrl: URL of a proxy that should be used for scraping. - ## - proxyUrl: "" - - ## MetricRelabelConfigs to apply to samples after scraping, but before ingestion. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - metricRelabelings: [] - # - action: keep - # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' - # sourceLabels: [__name__] - - ## RelabelConfigs to apply to samples before scraping - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - relabelings: [] - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace - - ## Additional labels - ## - additionalLabels: {} - # foo: bar - -## Component scraping kubeDns. Use either this or coreDns -## -kubeDns: - enabled: false - service: - dnsmasq: - port: 10054 - targetPort: 10054 - skydns: - port: 10055 - targetPort: 10055 - # selector: - # k8s-app: kube-dns - serviceMonitor: - ## Scrape interval. If not set, the Prometheus default scrape interval is used. - ## - interval: "" - - ## SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. - ## - sampleLimit: 0 - - ## TargetLimit defines a limit on the number of scraped targets that will be accepted. - ## - targetLimit: 0 - - ## Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelLimit: 0 - - ## Per-scrape limit on length of labels name that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelNameLengthLimit: 0 - - ## Per-scrape limit on length of labels value that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelValueLengthLimit: 0 - - ## proxyUrl: URL of a proxy that should be used for scraping. - ## - proxyUrl: "" - - ## MetricRelabelConfigs to apply to samples after scraping, but before ingestion. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - metricRelabelings: [] - # - action: keep - # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' - # sourceLabels: [__name__] - - ## RelabelConfigs to apply to samples before scraping - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - relabelings: [] - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace - - ## MetricRelabelConfigs to apply to samples after scraping, but before ingestion. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - dnsmasqMetricRelabelings: [] - # - action: keep - # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' - # sourceLabels: [__name__] - - ## RelabelConfigs to apply to samples before scraping - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - dnsmasqRelabelings: [] - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace - - ## Additional labels - ## - additionalLabels: {} - # foo: bar - -## Component scraping etcd -## -kubeEtcd: - enabled: false - - ## If your etcd is not deployed as a pod, specify IPs it can be found on - ## - endpoints: [] - # - 10.141.4.22 - # - 10.141.4.23 - # - 10.141.4.24 - - ## Etcd service. If using kubeEtcd.endpoints only the port and targetPort are used - ## - service: - enabled: true - port: 2381 - targetPort: 2381 - # selector: - # component: etcd - - ## Configure secure access to the etcd cluster by loading a secret into prometheus and - ## specifying security configuration below. For example, with a secret named etcd-client-cert - ## - ## serviceMonitor: - ## scheme: https - ## insecureSkipVerify: false - ## serverName: localhost - ## caFile: /etc/prometheus/secrets/etcd-client-cert/etcd-ca - ## certFile: /etc/prometheus/secrets/etcd-client-cert/etcd-client - ## keyFile: /etc/prometheus/secrets/etcd-client-cert/etcd-client-key - ## - serviceMonitor: - enabled: true - ## Scrape interval. If not set, the Prometheus default scrape interval is used. - ## - interval: "" - - ## SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. - ## - sampleLimit: 0 - - ## TargetLimit defines a limit on the number of scraped targets that will be accepted. - ## - targetLimit: 0 - - ## Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelLimit: 0 - - ## Per-scrape limit on length of labels name that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelNameLengthLimit: 0 - - ## Per-scrape limit on length of labels value that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelValueLengthLimit: 0 - - ## proxyUrl: URL of a proxy that should be used for scraping. - ## - proxyUrl: "" - scheme: http - insecureSkipVerify: false - serverName: "" - caFile: "" - certFile: "" - keyFile: "" - - ## MetricRelabelConfigs to apply to samples after scraping, but before ingestion. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - metricRelabelings: [] - # - action: keep - # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' - # sourceLabels: [__name__] - - ## RelabelConfigs to apply to samples before scraping - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - relabelings: [] - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace - - ## Additional labels - ## - additionalLabels: {} - # foo: bar - -## Component scraping kube scheduler -## -kubeScheduler: - enabled: false - - ## If your kube scheduler is not deployed as a pod, specify IPs it can be found on - ## - endpoints: [] - # - 10.141.4.22 - # - 10.141.4.23 - # - 10.141.4.24 - - ## If using kubeScheduler.endpoints only the port and targetPort are used - ## - service: - enabled: true - ## If null or unset, the value is determined dynamically based on target Kubernetes version due to change - ## of default port in Kubernetes 1.23. - ## - port: null - targetPort: null - # selector: - # component: kube-scheduler - - serviceMonitor: - enabled: true - ## Scrape interval. If not set, the Prometheus default scrape interval is used. - ## - interval: "" - - ## SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. - ## - sampleLimit: 0 - - ## TargetLimit defines a limit on the number of scraped targets that will be accepted. - ## - targetLimit: 0 - - ## Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelLimit: 0 - - ## Per-scrape limit on length of labels name that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelNameLengthLimit: 0 - - ## Per-scrape limit on length of labels value that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelValueLengthLimit: 0 - - ## proxyUrl: URL of a proxy that should be used for scraping. - ## - proxyUrl: "" - ## Enable scraping kube-scheduler over https. - ## Requires proper certs (not self-signed) and delegated authentication/authorization checks. - ## If null or unset, the value is determined dynamically based on target Kubernetes version. - ## - https: null - - ## Skip TLS certificate validation when scraping - insecureSkipVerify: null - - ## Name of the server to use when validating TLS certificate - serverName: null - - ## MetricRelabelConfigs to apply to samples after scraping, but before ingestion. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - metricRelabelings: [] - # - action: keep - # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' - # sourceLabels: [__name__] - - ## RelabelConfigs to apply to samples before scraping - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - relabelings: [] - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace - - ## Additional labels - ## - additionalLabels: {} - # foo: bar - -## Component scraping kube proxy -## -kubeProxy: - enabled: false - - ## If your kube proxy is not deployed as a pod, specify IPs it can be found on - ## - endpoints: [] - # - 10.141.4.22 - # - 10.141.4.23 - # - 10.141.4.24 - - service: - enabled: true - port: 10249 - targetPort: 10249 - # selector: - # k8s-app: kube-proxy - - serviceMonitor: - enabled: true - ## Scrape interval. If not set, the Prometheus default scrape interval is used. - ## - interval: "" - - ## SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. - ## - sampleLimit: 0 - - ## TargetLimit defines a limit on the number of scraped targets that will be accepted. - ## - targetLimit: 0 - - ## Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelLimit: 0 - - ## Per-scrape limit on length of labels name that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelNameLengthLimit: 0 - - ## Per-scrape limit on length of labels value that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelValueLengthLimit: 0 - - ## proxyUrl: URL of a proxy that should be used for scraping. - ## - proxyUrl: "" - - ## Enable scraping kube-proxy over https. - ## Requires proper certs (not self-signed) and delegated authentication/authorization checks - ## - https: false - - ## MetricRelabelConfigs to apply to samples after scraping, but before ingestion. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - metricRelabelings: [] - # - action: keep - # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' - # sourceLabels: [__name__] - - ## RelabelConfigs to apply to samples before scraping - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - relabelings: [] - # - action: keep - # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' - # sourceLabels: [__name__] - - ## Additional labels - ## - additionalLabels: {} - # foo: bar - -## Component scraping kube state metrics -## -kubeStateMetrics: - enabled: true - -## Configuration for kube-state-metrics subchart -## -kube-state-metrics: - namespaceOverride: "" - rbac: - create: true - releaseLabel: true - prometheus: - monitor: - enabled: true - - ## Scrape interval. If not set, the Prometheus default scrape interval is used. - ## - interval: "" - - ## SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. - ## - sampleLimit: 0 - - ## TargetLimit defines a limit on the number of scraped targets that will be accepted. - ## - targetLimit: 0 - - ## Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelLimit: 0 - - ## Per-scrape limit on length of labels name that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelNameLengthLimit: 0 - - ## Per-scrape limit on length of labels value that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelValueLengthLimit: 0 - - ## Scrape Timeout. If not set, the Prometheus default scrape timeout is used. - ## - scrapeTimeout: "" - - ## proxyUrl: URL of a proxy that should be used for scraping. - ## - proxyUrl: "" - - # Keep labels from scraped data, overriding server-side labels - ## - honorLabels: true - - ## MetricRelabelConfigs to apply to samples after scraping, but before ingestion. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - metricRelabelings: [] - # - action: keep - # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' - # sourceLabels: [__name__] - - ## RelabelConfigs to apply to samples before scraping - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - relabelings: [] - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace - - selfMonitor: - enabled: false - -## Deploy node exporter as a daemonset to all nodes -## -nodeExporter: - enabled: true - -## Configuration for prometheus-node-exporter subchart -## -prometheus-node-exporter: - namespaceOverride: "" - podLabels: - ## Add the 'node-exporter' label to be used by serviceMonitor to match standard common usage in rules and grafana dashboards - ## - jobLabel: node-exporter - releaseLabel: true - extraArgs: - - --collector.filesystem.mount-points-exclude=^/(dev|proc|sys|var/lib/docker/.+|var/lib/kubelet/.+)($|/) - - --collector.filesystem.fs-types-exclude=^(autofs|binfmt_misc|bpf|cgroup2?|configfs|debugfs|devpts|devtmpfs|fusectl|hugetlbfs|iso9660|mqueue|nsfs|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|selinuxfs|squashfs|sysfs|tracefs)$ - service: - portName: http-metrics - prometheus: - monitor: - enabled: true - - jobLabel: jobLabel - - ## Scrape interval. If not set, the Prometheus default scrape interval is used. - ## - interval: "" - - ## SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. - ## - sampleLimit: 0 - - ## TargetLimit defines a limit on the number of scraped targets that will be accepted. - ## - targetLimit: 0 - - ## Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelLimit: 0 - - ## Per-scrape limit on length of labels name that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelNameLengthLimit: 0 - - ## Per-scrape limit on length of labels value that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelValueLengthLimit: 0 - - ## How long until a scrape request times out. If not set, the Prometheus default scape timeout is used. - ## - scrapeTimeout: "" - - ## proxyUrl: URL of a proxy that should be used for scraping. - ## - proxyUrl: "" - - ## MetricRelabelConfigs to apply to samples after scraping, but before ingestion. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - metricRelabelings: [] - # - sourceLabels: [__name__] - # separator: ; - # regex: ^node_mountstats_nfs_(event|operations|transport)_.+ - # replacement: $1 - # action: drop - - ## RelabelConfigs to apply to samples before scraping - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig - ## - relabelings: [] - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace - -## Manages Prometheus and Alertmanager components -## -prometheusOperator: - enabled: true - - ## Prometheus-Operator v0.39.0 and later support TLS natively. - ## - tls: - enabled: true - # Value must match version names from https://golang.org/pkg/crypto/tls/#pkg-constants - tlsMinVersion: VersionTLS13 - # Users who are deploying this chart in GKE private clusters will need to add firewall rules to expose this port for admissions webhooks - internalPort: 8443 - - ## Admission webhook support for PrometheusRules resources added in Prometheus Operator 0.30 can be enabled to prevent incorrectly formatted - ## rules from making their way into prometheus and potentially preventing the container from starting - admissionWebhooks: - ## Valid values: Fail, Ignore, IgnoreOnInstallOnly - ## IgnoreOnInstallOnly - If Release.IsInstall returns "true", set "Ignore" otherwise "Fail" - failurePolicy: - ## The default timeoutSeconds is 10 and the maximum value is 30. - timeoutSeconds: 10 - enabled: true - ## A PEM encoded CA bundle which will be used to validate the webhook's server certificate. - ## If unspecified, system trust roots on the apiserver are used. - caBundle: "" - ## If enabled, generate a self-signed certificate, then patch the webhook configurations with the generated data. - ## On chart upgrades (or if the secret exists) the cert will not be re-generated. You can use this to provide your own - ## certs ahead of time if you wish. - ## - annotations: {} - # argocd.argoproj.io/hook: PreSync - # argocd.argoproj.io/hook-delete-policy: HookSucceeded - patch: - enabled: true - image: - repository: rancher/mirrored-ingress-nginx-kube-webhook-certgen - tag: v20221220-controller-v1.5.1-58-g787ea74b6 - sha: "" - pullPolicy: IfNotPresent - resources: {} - ## Provide a priority class name to the webhook patching job - ## - priorityClassName: "" - annotations: {} - # argocd.argoproj.io/hook: PreSync - # argocd.argoproj.io/hook-delete-policy: HookSucceeded - podAnnotations: {} - nodeSelector: {} - affinity: {} - tolerations: [] - - ## SecurityContext holds pod-level security attributes and common container settings. - ## This defaults to non root user with uid 2000 and gid 2000. *v1.PodSecurityContext false - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ - ## - securityContext: - runAsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 - - # Security context for create job container - createSecretJob: - securityContext: {} - - # Security context for patch job container - patchWebhookJob: - securityContext: {} - - # Use certmanager to generate webhook certs - certManager: - enabled: false - # self-signed root certificate - rootCert: - duration: "" # default to be 5y - admissionCert: - duration: "" # default to be 1y - # issuerRef: - # name: "issuer" - # kind: "ClusterIssuer" - - ## Namespaces to scope the interaction of the Prometheus Operator and the apiserver (allow list). - ## This is mutually exclusive with denyNamespaces. Setting this to an empty object will disable the configuration - ## - namespaces: {} - # releaseNamespace: true - # additional: - # - kube-system - - ## Namespaces not to scope the interaction of the Prometheus Operator (deny list). - ## - denyNamespaces: [] - - ## Filter namespaces to look for prometheus-operator custom resources - ## - alertmanagerInstanceNamespaces: [] - alertmanagerConfigNamespaces: [] - prometheusInstanceNamespaces: [] - thanosRulerInstanceNamespaces: [] - - ## The clusterDomain value will be added to the cluster.peer option of the alertmanager. - ## Without this specified option cluster.peer will have value alertmanager-monitoring-alertmanager-0.alertmanager-operated:9094 (default value) - ## With this specified option cluster.peer will have value alertmanager-monitoring-alertmanager-0.alertmanager-operated.namespace.svc.cluster-domain:9094 - ## - # clusterDomain: "cluster.local" - - networkPolicy: - ## Enable creation of NetworkPolicy resources. - ## - enabled: false - - ## Flavor of the network policy to use. - # Can be: - # * kubernetes for networking.k8s.io/v1/NetworkPolicy - # * cilium for cilium.io/v2/CiliumNetworkPolicy - flavor: kubernetes - - # cilium: - # egress: - - ## Service account for Alertmanager to use. - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/ - ## - serviceAccount: - create: true - name: "" - - ## Configuration for Prometheus operator service - ## - service: - annotations: {} - labels: {} - clusterIP: "" - - ## Port to expose on each node - ## Only used if service.type is 'NodePort' - ## - nodePort: 30080 - - nodePortTls: 30443 - - ## Additional ports to open for Prometheus service - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#multi-port-services - ## - additionalPorts: [] - - ## Loadbalancer IP - ## Only use if service.type is "LoadBalancer" - ## - loadBalancerIP: "" - loadBalancerSourceRanges: [] - - ## Denotes if this Service desires to route external traffic to node-local or cluster-wide endpoints - ## - externalTrafficPolicy: Cluster - - ## Service type - ## NodePort, ClusterIP, LoadBalancer - ## - type: ClusterIP - - ## List of IP addresses at which the Prometheus server service is available - ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips - ## - externalIPs: [] - - # ## Labels to add to the operator deployment - # ## - labels: {} - - ## Annotations to add to the operator deployment - ## - annotations: {} - - ## Labels to add to the operator pod - ## - podLabels: {} - - ## Annotations to add to the operator pod - ## - podAnnotations: {} - - ## Assign a PriorityClassName to pods if set - # priorityClassName: "" - - ## Define Log Format - # Use logfmt (default) or json logging - # logFormat: logfmt - - ## Decrease log verbosity to errors only - # logLevel: error - - ## If true, the operator will create and maintain a service for scraping kubelets - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/helm/prometheus-operator/README.md - ## - kubeletService: - enabled: true - namespace: kube-system - ## Use '{{ template "kube-prometheus-stack.fullname" . }}-kubelet' by default - name: "" - - ## Create a servicemonitor for the operator - ## - serviceMonitor: - ## Labels for ServiceMonitor - additionalLabels: {} - - ## Scrape interval. If not set, the Prometheus default scrape interval is used. - ## - interval: "" - - ## SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. - ## - sampleLimit: 0 - - ## TargetLimit defines a limit on the number of scraped targets that will be accepted. - ## - targetLimit: 0 - - ## Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelLimit: 0 - - ## Per-scrape limit on length of labels name that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelNameLengthLimit: 0 - - ## Per-scrape limit on length of labels value that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelValueLengthLimit: 0 - - ## Scrape timeout. If not set, the Prometheus default scrape timeout is used. - scrapeTimeout: "" - selfMonitor: true - - ## Metric relabel configs to apply to samples before ingestion. - ## - metricRelabelings: [] - # - action: keep - # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' - # sourceLabels: [__name__] - - # relabel configs to apply to samples before ingestion. - ## - relabelings: [] - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace - - ## Resource limits & requests - ## - resources: - limits: - cpu: 200m - memory: 500Mi - requests: - cpu: 100m - memory: 100Mi - - # Required for use in managed kubernetes clusters (such as AWS EKS) with custom CNI (such as calico), - # because control-plane managed by AWS cannot communicate with pods' IP CIDR and admission webhooks are not working - ## - hostNetwork: false - - ## Define which Nodes the Pods are scheduled on. - ## ref: https://kubernetes.io/docs/user-guide/node-selection/ - ## - nodeSelector: {} - - ## Tolerations for use with node taints - ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - ## - tolerations: [] - # - key: "key" - # operator: "Equal" - # value: "value" - # effect: "NoSchedule" - - ## Assign custom affinity rules to the prometheus operator - ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - ## - affinity: {} - # nodeAffinity: - # requiredDuringSchedulingIgnoredDuringExecution: - # nodeSelectorTerms: - # - matchExpressions: - # - key: kubernetes.io/e2e-az-name - # operator: In - # values: - # - e2e-az1 - # - e2e-az2 - dnsConfig: {} - # nameservers: - # - 1.2.3.4 - # searches: - # - ns1.svc.cluster-domain.example - # - my.dns.search.suffix - # options: - # - name: ndots - # value: "2" - # - name: edns0 - securityContext: - fsGroup: 65534 - runAsGroup: 65534 - runAsNonRoot: true - runAsUser: 65534 - - ## Container-specific security context configuration - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ - ## - containerSecurityContext: - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - - # Enable vertical pod autoscaler support for prometheus-operator - verticalPodAutoscaler: - enabled: false - # List of resources that the vertical pod autoscaler can control. Defaults to cpu and memory - controlledResources: [] - - # Define the max allowed resources for the pod - maxAllowed: {} - # cpu: 200m - # memory: 100Mi - # Define the min allowed resources for the pod - minAllowed: {} - # cpu: 200m - # memory: 100Mi - - updatePolicy: - # Specifies whether recommended updates are applied when a Pod is started and whether recommended updates - # are applied during the life of a Pod. Possible values are "Off", "Initial", "Recreate", and "Auto". - updateMode: Auto - - ## Prometheus-operator image - ## - image: - repository: rancher/mirrored-prometheus-operator-prometheus-operator - tag: v0.65.1 - sha: "" - pullPolicy: IfNotPresent - - ## Prometheus image to use for prometheuses managed by the operator - ## - # prometheusDefaultBaseImage: prometheus/prometheus - - ## Prometheus image registry to use for prometheuses managed by the operator - ## - # prometheusDefaultBaseImageRegistry: quay.io - - ## Alertmanager image to use for alertmanagers managed by the operator - ## - # alertmanagerDefaultBaseImage: prometheus/alertmanager - - ## Alertmanager image registry to use for alertmanagers managed by the operator - ## - # alertmanagerDefaultBaseImageRegistry: quay.io - - ## Prometheus-config-reloader - ## - prometheusConfigReloader: - image: - repository: rancher/mirrored-prometheus-operator-prometheus-config-reloader - tag: v0.65.1 - sha: "" - - # add prometheus config reloader liveness and readiness probe. Default: false - enableProbe: false - - # resource config for prometheusConfigReloader - resources: - requests: - cpu: 200m - memory: 50Mi - limits: - cpu: 200m - memory: 50Mi - - ## Thanos side-car image when configured - ## - thanosImage: - repository: rancher/mirrored-thanos-thanos - tag: v0.30.2 - sha: "" - - ## Set a Label Selector to filter watched prometheus and prometheusAgent - ## - prometheusInstanceSelector: "" - - ## Set a Label Selector to filter watched alertmanager - ## - alertmanagerInstanceSelector: "" - - ## Set a Label Selector to filter watched thanosRuler - thanosRulerInstanceSelector: "" - - ## Set a Field Selector to filter watched secrets - ## - secretFieldSelector: "type!=kubernetes.io/dockercfg,type!=kubernetes.io/service-account-token,type!=helm.sh/release.v1" - -## Deploy a Prometheus instance -## -prometheus: - enabled: true - - ## Annotations for Prometheus - ## - annotations: {} - - ## Configure network policy for the prometheus - networkPolicy: - enabled: false - - ## Flavor of the network policy to use. - # Can be: - # * kubernetes for networking.k8s.io/v1/NetworkPolicy - # * cilium for cilium.io/v2/CiliumNetworkPolicy - flavor: kubernetes - - # cilium: - # endpointSelector: - # egress: - # ingress: - - # egress: - # - {} - # ingress: - # - {} - # podSelector: - # matchLabels: - # app: prometheus - - ## Service account for Prometheuses to use. - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/ - ## - serviceAccount: - create: true - name: "" - annotations: {} - - # Service for thanos service discovery on sidecar - # Enable this can make Thanos Query can use - # `--store=dnssrv+_grpc._tcp.${kube-prometheus-stack.fullname}-thanos-discovery.${namespace}.svc.cluster.local` to discovery - # Thanos sidecar on prometheus nodes - # (Please remember to change ${kube-prometheus-stack.fullname} and ${namespace}. Not just copy and paste!) - thanosService: - enabled: false - annotations: {} - labels: {} - - ## Denotes if this Service desires to route external traffic to node-local or cluster-wide endpoints - ## - externalTrafficPolicy: Cluster - - ## Service type - ## - type: ClusterIP - - ## gRPC port config - portName: grpc - port: 10901 - targetPort: "grpc" - - ## HTTP port config (for metrics) - httpPortName: http - httpPort: 10902 - targetHttpPort: "http" - - ## ClusterIP to assign - # Default is to make this a headless service ("None") - clusterIP: "None" - - ## Port to expose on each node, if service type is NodePort - ## - nodePort: 30901 - httpNodePort: 30902 - - # ServiceMonitor to scrape Sidecar metrics - # Needs thanosService to be enabled as well - thanosServiceMonitor: - enabled: false - interval: "" - - ## Additional labels - ## - additionalLabels: {} - - ## scheme: HTTP scheme to use for scraping. Can be used with `tlsConfig` for example if using istio mTLS. - scheme: "" - - ## tlsConfig: TLS configuration to use when scraping the endpoint. For example if using istio mTLS. - ## Of type: https://github.com/coreos/prometheus-operator/blob/main/Documentation/api.md#tlsconfig - tlsConfig: {} - - bearerTokenFile: - - ## Metric relabel configs to apply to samples before ingestion. - metricRelabelings: [] - - ## relabel configs to apply to samples before ingestion. - relabelings: [] - - # Service for external access to sidecar - # Enabling this creates a service to expose thanos-sidecar outside the cluster. - thanosServiceExternal: - enabled: false - annotations: {} - labels: {} - loadBalancerIP: "" - loadBalancerSourceRanges: [] - - ## gRPC port config - portName: grpc - port: 10901 - targetPort: "grpc" - - ## HTTP port config (for metrics) - httpPortName: http - httpPort: 10902 - targetHttpPort: "http" - - ## Denotes if this Service desires to route external traffic to node-local or cluster-wide endpoints - ## - externalTrafficPolicy: Cluster - - ## Service type - ## - type: LoadBalancer - - ## Port to expose on each node - ## - nodePort: 30901 - httpNodePort: 30902 - - ## Configuration for Prometheus service - ## - service: - annotations: {} - labels: {} - clusterIP: "" - - ## Port for Prometheus Service to listen on - ## - port: 9090 - - ## To be used with a proxy extraContainer port - targetPort: 8081 - - ## List of IP addresses at which the Prometheus server service is available - ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips - ## - externalIPs: [] - - ## Port to expose on each node - ## Only used if service.type is 'NodePort' - ## - nodePort: 30090 - - ## Loadbalancer IP - ## Only use if service.type is "LoadBalancer" - loadBalancerIP: "" - loadBalancerSourceRanges: [] - - ## Denotes if this Service desires to route external traffic to node-local or cluster-wide endpoints - ## - externalTrafficPolicy: Cluster - - ## Service type - ## - type: ClusterIP - - ## Additional port to define in the Service - additionalPorts: [] - # additionalPorts: - # - name: authenticated - # port: 8081 - # targetPort: 8081 - - ## Consider that all endpoints are considered "ready" even if the Pods themselves are not - ## Ref: https://kubernetes.io/docs/reference/kubernetes-api/service-resources/service-v1/#ServiceSpec - publishNotReadyAddresses: false - - sessionAffinity: "" - - ## Configuration for creating a separate Service for each statefulset Prometheus replica - ## - servicePerReplica: - enabled: false - annotations: {} - - ## Port for Prometheus Service per replica to listen on - ## - port: 9090 - - ## To be used with a proxy extraContainer port - targetPort: 9090 - - ## Port to expose on each node - ## Only used if servicePerReplica.type is 'NodePort' - ## - nodePort: 30091 - - ## Loadbalancer source IP ranges - ## Only used if servicePerReplica.type is "LoadBalancer" - loadBalancerSourceRanges: [] - - ## Denotes if this Service desires to route external traffic to node-local or cluster-wide endpoints - ## - externalTrafficPolicy: Cluster - - ## Service type - ## - type: ClusterIP - - ## Configure pod disruption budgets for Prometheus - ## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget - ## This configuration is immutable once created and will require the PDB to be deleted to be changed - ## https://github.com/kubernetes/kubernetes/issues/45398 - ## - podDisruptionBudget: - enabled: false - minAvailable: 1 - maxUnavailable: "" - - # Ingress exposes thanos sidecar outside the cluster - thanosIngress: - enabled: false - - # For Kubernetes >= 1.18 you should specify the ingress-controller via the field ingressClassName - # See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#specifying-the-class-of-an-ingress - # ingressClassName: nginx - - annotations: {} - labels: {} - servicePort: 10901 - - ## Port to expose on each node - ## Only used if service.type is 'NodePort' - ## - nodePort: 30901 - - ## Hosts must be provided if Ingress is enabled. - ## - hosts: [] - # - thanos-gateway.domain.com - - ## Paths to use for ingress rules - ## - paths: [] - # - / - - ## For Kubernetes >= 1.18 you should specify the pathType (determines how Ingress paths should be matched) - ## See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#better-path-matching-with-path-types - # pathType: ImplementationSpecific - - ## TLS configuration for Thanos Ingress - ## Secret must be manually created in the namespace - ## - tls: [] - # - secretName: thanos-gateway-tls - # hosts: - # - thanos-gateway.domain.com - # - - ## ExtraSecret can be used to store various data in an extra secret - ## (use it for example to store hashed basic auth credentials) - extraSecret: - ## if not set, name will be auto generated - # name: "" - annotations: {} - data: {} - # auth: | - # foo:$apr1$OFG3Xybp$ckL0FHDAkoXYIlH9.cysT0 - # someoneelse:$apr1$DMZX2Z4q$6SbQIfyuLQd.xmo/P0m2c. - - ingress: - enabled: false - - # For Kubernetes >= 1.18 you should specify the ingress-controller via the field ingressClassName - # See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#specifying-the-class-of-an-ingress - # ingressClassName: nginx - - annotations: {} - labels: {} - - ## Redirect ingress to an additional defined port on the service - # servicePort: 8081 - - ## Hostnames. - ## Must be provided if Ingress is enabled. - ## - # hosts: - # - prometheus.domain.com - hosts: [] - - ## Paths to use for ingress rules - one path should match the prometheusSpec.routePrefix - ## - paths: [] - # - / - - ## For Kubernetes >= 1.18 you should specify the pathType (determines how Ingress paths should be matched) - ## See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#better-path-matching-with-path-types - # pathType: ImplementationSpecific - - ## TLS configuration for Prometheus Ingress - ## Secret must be manually created in the namespace - ## - tls: [] - # - secretName: prometheus-general-tls - # hosts: - # - prometheus.example.com - - ## Configuration for creating an Ingress that will map to each Prometheus replica service - ## prometheus.servicePerReplica must be enabled - ## - ingressPerReplica: - enabled: false - - # For Kubernetes >= 1.18 you should specify the ingress-controller via the field ingressClassName - # See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#specifying-the-class-of-an-ingress - # ingressClassName: nginx - - annotations: {} - labels: {} - - ## Final form of the hostname for each per replica ingress is - ## {{ ingressPerReplica.hostPrefix }}-{{ $replicaNumber }}.{{ ingressPerReplica.hostDomain }} - ## - ## Prefix for the per replica ingress that will have `-$replicaNumber` - ## appended to the end - hostPrefix: "" - ## Domain that will be used for the per replica ingress - hostDomain: "" - - ## Paths to use for ingress rules - ## - paths: [] - # - / - - ## For Kubernetes >= 1.18 you should specify the pathType (determines how Ingress paths should be matched) - ## See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#better-path-matching-with-path-types - # pathType: ImplementationSpecific - - ## Secret name containing the TLS certificate for Prometheus per replica ingress - ## Secret must be manually created in the namespace - tlsSecretName: "" - - ## Separated secret for each per replica Ingress. Can be used together with cert-manager - ## - tlsSecretPerReplica: - enabled: false - ## Final form of the secret for each per replica ingress is - ## {{ tlsSecretPerReplica.prefix }}-{{ $replicaNumber }} - ## - prefix: "prometheus" - - ## Configure additional options for default pod security policy for Prometheus - ## ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/ - podSecurityPolicy: - allowedCapabilities: [] - allowedHostPaths: [] - volumes: [] - - serviceMonitor: - ## Scrape interval. If not set, the Prometheus default scrape interval is used. - ## - interval: "" - selfMonitor: true - - ## Additional labels - ## - additionalLabels: {} - - ## SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. - ## - sampleLimit: 0 - - ## TargetLimit defines a limit on the number of scraped targets that will be accepted. - ## - targetLimit: 0 - - ## Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelLimit: 0 - - ## Per-scrape limit on length of labels name that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelNameLengthLimit: 0 - - ## Per-scrape limit on length of labels value that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. - ## - labelValueLengthLimit: 0 - - ## scheme: HTTP scheme to use for scraping. Can be used with `tlsConfig` for example if using istio mTLS. - scheme: "" - - ## tlsConfig: TLS configuration to use when scraping the endpoint. For example if using istio mTLS. - ## Of type: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#tlsconfig - tlsConfig: {} - - bearerTokenFile: - - ## Metric relabel configs to apply to samples before ingestion. - ## - metricRelabelings: [] - # - action: keep - # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' - # sourceLabels: [__name__] - - # relabel configs to apply to samples before ingestion. - ## - relabelings: [] - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace - - ## Settings affecting prometheusSpec - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#prometheusspec - ## - prometheusSpec: - ## If true, pass --storage.tsdb.max-block-duration=2h to prometheus. This is already done if using Thanos - ## - disableCompaction: false - ## APIServerConfig - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#apiserverconfig - ## - apiserverConfig: {} - - ## Allows setting additional arguments for the Prometheus container - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#monitoring.coreos.com/v1.Prometheus - additionalArgs: [] - - ## Interval between consecutive scrapes. - ## Defaults to 30s. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/release-0.44/pkg/prometheus/promcfg.go#L180-L183 - ## - scrapeInterval: "" - - ## Number of seconds to wait for target to respond before erroring - ## - scrapeTimeout: "" - - ## Interval between consecutive evaluations. - ## - evaluationInterval: "" - - ## ListenLocal makes the Prometheus server listen on loopback, so that it does not bind against the Pod IP. - ## - listenLocal: false - - ## EnableAdminAPI enables Prometheus the administrative HTTP API which includes functionality such as deleting time series. - ## This is disabled by default. - ## ref: https://prometheus.io/docs/prometheus/latest/querying/api/#tsdb-admin-apis - ## - enableAdminAPI: false - - ## Sets version of Prometheus overriding the Prometheus version as derived - ## from the image tag. Useful in cases where the tag does not follow semver v2. - version: "" - - ## WebTLSConfig defines the TLS parameters for HTTPS - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#webtlsconfig - web: {} - - ## Exemplars related settings that are runtime reloadable. - ## It requires to enable the exemplar storage feature to be effective. - exemplars: "" - ## Maximum number of exemplars stored in memory for all series. - ## If not set, Prometheus uses its default value. - ## A value of zero or less than zero disables the storage. - # maxSize: 100000 - - # EnableFeatures API enables access to Prometheus disabled features. - # ref: https://prometheus.io/docs/prometheus/latest/disabled_features/ - enableFeatures: [] - # - exemplar-storage - - ## Image of Prometheus. - ## - image: - repository: rancher/mirrored-prometheus-prometheus - tag: v2.45.0 - sha: "" - - ## Tolerations for use with node taints - ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - ## - tolerations: [] - # - key: "key" - # operator: "Equal" - # value: "value" - # effect: "NoSchedule" - - ## If specified, the pod's topology spread constraints. - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ - ## - topologySpreadConstraints: [] - # - maxSkew: 1 - # topologyKey: topology.kubernetes.io/zone - # whenUnsatisfiable: DoNotSchedule - # labelSelector: - # matchLabels: - # app: prometheus - - ## Alertmanagers to which alerts will be sent - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#alertmanagerendpoints - ## - ## Default configuration will connect to the alertmanager deployed as part of this release - ## - alertingEndpoints: [] - # - name: "" - # namespace: "" - # port: http - # scheme: http - # pathPrefix: "" - # tlsConfig: {} - # bearerTokenFile: "" - # apiVersion: v2 - - ## External labels to add to any time series or alerts when communicating with external systems - ## - externalLabels: {} - - ## enable --web.enable-remote-write-receiver flag on prometheus-server - ## - enableRemoteWriteReceiver: false - - ## Name of the external label used to denote replica name - ## - replicaExternalLabelName: "" - - ## If true, the Operator won't add the external label used to denote replica name - ## - replicaExternalLabelNameClear: false - - ## Name of the external label used to denote Prometheus instance name - ## - prometheusExternalLabelName: "" - - ## If true, the Operator won't add the external label used to denote Prometheus instance name - ## - prometheusExternalLabelNameClear: false - - ## External URL at which Prometheus will be reachable. - ## - externalUrl: "" - - ## Define which Nodes the Pods are scheduled on. - ## ref: https://kubernetes.io/docs/user-guide/node-selection/ - ## - nodeSelector: {} - - ## Secrets is a list of Secrets in the same namespace as the Prometheus object, which shall be mounted into the Prometheus Pods. - ## The Secrets are mounted into /etc/prometheus/secrets/. Secrets changes after initial creation of a Prometheus object are not - ## reflected in the running Pods. To change the secrets mounted into the Prometheus Pods, the object must be deleted and recreated - ## with the new list of secrets. - ## - secrets: [] - - ## ConfigMaps is a list of ConfigMaps in the same namespace as the Prometheus object, which shall be mounted into the Prometheus Pods. - ## The ConfigMaps are mounted into /etc/prometheus/configmaps/. - ## - configMaps: [] - - ## QuerySpec defines the query command line flags when starting Prometheus. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#queryspec - ## - query: {} - - ## If nil, select own namespace. Namespaces to be selected for PrometheusRules discovery. - ruleNamespaceSelector: {} - ## Example which selects PrometheusRules in namespaces with label "prometheus" set to "somelabel" - # ruleNamespaceSelector: - # matchLabels: - # prometheus: somelabel - - ## If true, a nil or {} value for prometheus.prometheusSpec.ruleSelector will cause the - ## prometheus resource to be created with selectors based on values in the helm deployment, - ## which will also match the PrometheusRule resources created - ## - ruleSelectorNilUsesHelmValues: false - - ## PrometheusRules to be selected for target discovery. - ## If {}, select all PrometheusRules - ## - ruleSelector: {} - ## Example which select all PrometheusRules resources - ## with label "prometheus" with values any of "example-rules" or "example-rules-2" - # ruleSelector: - # matchExpressions: - # - key: prometheus - # operator: In - # values: - # - example-rules - # - example-rules-2 - # - ## Example which select all PrometheusRules resources with label "role" set to "example-rules" - # ruleSelector: - # matchLabels: - # role: example-rules - - ## If true, a nil or {} value for prometheus.prometheusSpec.serviceMonitorSelector will cause the - ## prometheus resource to be created with selectors based on values in the helm deployment, - ## which will also match the servicemonitors created - ## - serviceMonitorSelectorNilUsesHelmValues: false - - ## ServiceMonitors to be selected for target discovery. - ## If {}, select all ServiceMonitors - ## - serviceMonitorSelector: {} - ## Example which selects ServiceMonitors with label "prometheus" set to "somelabel" - # serviceMonitorSelector: - # matchLabels: - # prometheus: somelabel - - ## Namespaces to be selected for ServiceMonitor discovery. - ## - serviceMonitorNamespaceSelector: {} - ## Example which selects ServiceMonitors in namespaces with label "prometheus" set to "somelabel" - # serviceMonitorNamespaceSelector: - # matchLabels: - # prometheus: somelabel - - ## If true, a nil or {} value for prometheus.prometheusSpec.podMonitorSelector will cause the - ## prometheus resource to be created with selectors based on values in the helm deployment, - ## which will also match the podmonitors created - ## - podMonitorSelectorNilUsesHelmValues: false - - ## PodMonitors to be selected for target discovery. - ## If {}, select all PodMonitors - ## - podMonitorSelector: {} - ## Example which selects PodMonitors with label "prometheus" set to "somelabel" - # podMonitorSelector: - # matchLabels: - # prometheus: somelabel - - ## If nil, select own namespace. Namespaces to be selected for PodMonitor discovery. - podMonitorNamespaceSelector: {} - ## Example which selects PodMonitor in namespaces with label "prometheus" set to "somelabel" - # podMonitorNamespaceSelector: - # matchLabels: - # prometheus: somelabel - - ## If true, a nil or {} value for prometheus.prometheusSpec.probeSelector will cause the - ## prometheus resource to be created with selectors based on values in the helm deployment, - ## which will also match the probes created - ## - probeSelectorNilUsesHelmValues: true - - ## Probes to be selected for target discovery. - ## If {}, select all Probes - ## - probeSelector: {} - ## Example which selects Probes with label "prometheus" set to "somelabel" - # probeSelector: - # matchLabels: - # prometheus: somelabel - - ## If nil, select own namespace. Namespaces to be selected for Probe discovery. - probeNamespaceSelector: {} - ## Example which selects Probe in namespaces with label "prometheus" set to "somelabel" - # probeNamespaceSelector: - # matchLabels: - # prometheus: somelabel - - ## How long to retain metrics - ## - retention: 10d - - ## Maximum size of metrics - ## - retentionSize: "" - - ## Allow out-of-order/out-of-bounds samples ingested into Prometheus for a specified duration - ## See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#tsdb - tsdb: - outOfOrderTimeWindow: 0s - - ## Enable compression of the write-ahead log using Snappy. - ## - walCompression: true - - ## If true, the Operator won't process any Prometheus configuration changes - ## - paused: false - - ## Number of replicas of each shard to deploy for a Prometheus deployment. - ## Number of replicas multiplied by shards is the total number of Pods created. - ## - replicas: 1 - - ## EXPERIMENTAL: Number of shards to distribute targets onto. - ## Number of replicas multiplied by shards is the total number of Pods created. - ## Note that scaling down shards will not reshard data onto remaining instances, it must be manually moved. - ## Increasing shards will not reshard data either but it will continue to be available from the same instances. - ## To query globally use Thanos sidecar and Thanos querier or remote write data to a central location. - ## Sharding is done on the content of the `__address__` target meta-label. - ## - shards: 1 - - ## Log level for Prometheus be configured in - ## - logLevel: info - - ## Log format for Prometheus be configured in - ## - logFormat: logfmt - - ## Prefix used to register routes, overriding externalUrl route. - ## Useful for proxies that rewrite URLs. - ## - routePrefix: / - - ## Standard object's metadata. More info: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#metadata - ## Metadata Labels and Annotations gets propagated to the prometheus pods. - ## - podMetadata: {} - # labels: - # app: prometheus - # k8s-app: prometheus - - ## Pod anti-affinity can prevent the scheduler from placing Prometheus replicas on the same node. - ## The default value "soft" means that the scheduler should *prefer* to not schedule two replica pods onto the same node but no guarantee is provided. - ## The value "hard" means that the scheduler is *required* to not schedule two replica pods onto the same node. - ## The value "" will disable pod anti-affinity so that no anti-affinity rules will be configured. - podAntiAffinity: "" - - ## If anti-affinity is enabled sets the topologyKey to use for anti-affinity. - ## This can be changed to, for example, failure-domain.beta.kubernetes.io/zone - ## - podAntiAffinityTopologyKey: kubernetes.io/hostname - - ## Assign custom affinity rules to the prometheus instance - ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - ## - affinity: {} - # nodeAffinity: - # requiredDuringSchedulingIgnoredDuringExecution: - # nodeSelectorTerms: - # - matchExpressions: - # - key: kubernetes.io/e2e-az-name - # operator: In - # values: - # - e2e-az1 - # - e2e-az2 - - ## The remote_read spec configuration for Prometheus. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#remotereadspec - remoteRead: [] - # - url: http://remote1/read - ## additionalRemoteRead is appended to remoteRead - additionalRemoteRead: [] - - ## The remote_write spec configuration for Prometheus. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#remotewritespec - remoteWrite: [] - # - url: http://remote1/push - ## additionalRemoteWrite is appended to remoteWrite - additionalRemoteWrite: [] - - ## Enable/Disable Grafana dashboards provisioning for prometheus remote write feature - remoteWriteDashboards: false - - ## Resource limits & requests - ## - resources: - limits: - memory: 3000Mi - cpu: 1000m - requests: - memory: 750Mi - cpu: 750m - - ## Prometheus StorageSpec for persistent data - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/storage.md - ## - storageSpec: {} - ## Using PersistentVolumeClaim - ## - # volumeClaimTemplate: - # spec: - # storageClassName: gluster - # accessModes: ["ReadWriteOnce"] - # resources: - # requests: - # storage: 50Gi - # selector: {} - - ## Using tmpfs volume - ## - # emptyDir: - # medium: Memory - - # Additional volumes on the output StatefulSet definition. - volumes: - - name: nginx-home - emptyDir: {} - - name: prometheus-nginx - configMap: - name: prometheus-nginx-proxy-config - defaultMode: 438 - - # Additional VolumeMounts on the output StatefulSet definition. - volumeMounts: [] - - ## AdditionalScrapeConfigs allows specifying additional Prometheus scrape configurations. Scrape configurations - ## are appended to the configurations generated by the Prometheus Operator. Job configurations must have the form - ## as specified in the official Prometheus documentation: - ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config. As scrape configs are - ## appended, the user is responsible to make sure it is valid. Note that using this feature may expose the possibility - ## to break upgrades of Prometheus. It is advised to review Prometheus release notes to ensure that no incompatible - ## scrape configs are going to break Prometheus after the upgrade. - ## AdditionalScrapeConfigs can be defined as a list or as a templated string. - ## - ## The scrape configuration example below will find master nodes, provided they have the name .*mst.*, relabel the - ## port to 2379 and allow etcd scraping provided it is running on all Kubernetes master nodes - ## - additionalScrapeConfigs: [] - # - job_name: kube-etcd - # kubernetes_sd_configs: - # - role: node - # scheme: https - # tls_config: - # ca_file: /etc/prometheus/secrets/etcd-client-cert/etcd-ca - # cert_file: /etc/prometheus/secrets/etcd-client-cert/etcd-client - # key_file: /etc/prometheus/secrets/etcd-client-cert/etcd-client-key - # relabel_configs: - # - action: labelmap - # regex: __meta_kubernetes_node_label_(.+) - # - source_labels: [__address__] - # action: replace - # targetLabel: __address__ - # regex: ([^:;]+):(\d+) - # replacement: ${1}:2379 - # - source_labels: [__meta_kubernetes_node_name] - # action: keep - # regex: .*mst.* - # - source_labels: [__meta_kubernetes_node_name] - # action: replace - # targetLabel: node - # regex: (.*) - # replacement: ${1} - # metric_relabel_configs: - # - regex: (kubernetes_io_hostname|failure_domain_beta_kubernetes_io_region|beta_kubernetes_io_os|beta_kubernetes_io_arch|beta_kubernetes_io_instance_type|failure_domain_beta_kubernetes_io_zone) - # action: labeldrop - # - ## If scrape config contains a repetitive section, you may want to use a template. - ## In the following example, you can see how to define `gce_sd_configs` for multiple zones - # additionalScrapeConfigs: | - # - job_name: "node-exporter" - # gce_sd_configs: - # {{range $zone := .Values.gcp_zones}} - # - project: "project1" - # zone: "{{$zone}}" - # port: 9100 - # {{end}} - # relabel_configs: - # ... - - - ## If additional scrape configurations are already deployed in a single secret file you can use this section. - ## Expected values are the secret name and key - ## Cannot be used with additionalScrapeConfigs - additionalScrapeConfigsSecret: {} - # enabled: false - # name: - # key: - - ## additionalPrometheusSecretsAnnotations allows to add annotations to the kubernetes secret. This can be useful - ## when deploying via spinnaker to disable versioning on the secret, strategy.spinnaker.io/versioned: 'false' - additionalPrometheusSecretsAnnotations: {} - - ## AdditionalAlertManagerConfigs allows for manual configuration of alertmanager jobs in the form as specified - ## in the official Prometheus documentation https://prometheus.io/docs/prometheus/latest/configuration/configuration/#. - ## AlertManager configurations specified are appended to the configurations generated by the Prometheus Operator. - ## As AlertManager configs are appended, the user is responsible to make sure it is valid. Note that using this - ## feature may expose the possibility to break upgrades of Prometheus. It is advised to review Prometheus release - ## notes to ensure that no incompatible AlertManager configs are going to break Prometheus after the upgrade. - ## - additionalAlertManagerConfigs: [] - # - consul_sd_configs: - # - server: consul.dev.test:8500 - # scheme: http - # datacenter: dev - # tag_separator: ',' - # services: - # - metrics-prometheus-alertmanager - - ## If additional alertmanager configurations are already deployed in a single secret, or you want to manage - ## them separately from the helm deployment, you can use this section. - ## Expected values are the secret name and key - ## Cannot be used with additionalAlertManagerConfigs - additionalAlertManagerConfigsSecret: {} - # name: - # key: - # optional: false - - ## AdditionalAlertRelabelConfigs allows specifying Prometheus alert relabel configurations. Alert relabel configurations specified are appended - ## to the configurations generated by the Prometheus Operator. Alert relabel configurations specified must have the form as specified in the - ## official Prometheus documentation: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#alert_relabel_configs. - ## As alert relabel configs are appended, the user is responsible to make sure it is valid. Note that using this feature may expose the - ## possibility to break upgrades of Prometheus. It is advised to review Prometheus release notes to ensure that no incompatible alert relabel - ## configs are going to break Prometheus after the upgrade. - ## - additionalAlertRelabelConfigs: [] - # - separator: ; - # regex: prometheus_replica - # replacement: $1 - # action: labeldrop - - ## If additional alert relabel configurations are already deployed in a single secret, or you want to manage - ## them separately from the helm deployment, you can use this section. - ## Expected values are the secret name and key - ## Cannot be used with additionalAlertRelabelConfigs - additionalAlertRelabelConfigsSecret: {} - # name: - # key: - - ## SecurityContext holds pod-level security attributes and common container settings. - ## This defaults to non root user with uid 1000 and gid 2000. - ## https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md - ## - securityContext: - runAsGroup: 2000 - runAsNonRoot: true - runAsUser: 1000 - fsGroup: 2000 - - ## Priority class assigned to the Pods - ## - priorityClassName: "" - - ## Thanos configuration allows configuring various aspects of a Prometheus server in a Thanos environment. - ## This section is experimental, it may change significantly without deprecation notice in any release. - ## This is experimental and may change significantly without backward compatibility in any release. - ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#thanosspec - ## - thanos: {} - # secretProviderClass: - # provider: gcp - # parameters: - # secrets: | - # - resourceName: "projects/$PROJECT_ID/secrets/testsecret/versions/latest" - # fileName: "objstore.yaml" - # objectStorageConfigFile: /var/secrets/object-store.yaml - - proxy: - image: - repository: rancher/mirrored-library-nginx - tag: 1.24.0-alpine - - ## Containers allows injecting additional containers. This is meant to allow adding an authentication proxy to a Prometheus pod. - ## if using proxy extraContainer update targetPort with proxy container port - containers: | - - name: prometheus-proxy - args: - - nginx - - -g - - daemon off; - - -c - - /nginx/nginx.conf - image: "{{ template "system_default_registry" . }}{{ .Values.prometheus.prometheusSpec.proxy.image.repository }}:{{ .Values.prometheus.prometheusSpec.proxy.image.tag }}" - ports: - - containerPort: 8081 - name: nginx-http - protocol: TCP - volumeMounts: - - mountPath: /nginx - name: prometheus-nginx - - mountPath: /var/cache/nginx - name: nginx-home - securityContext: - runAsUser: 101 - runAsGroup: 101 - - ## InitContainers allows injecting additional initContainers. This is meant to allow doing some changes - ## (permissions, dir tree) on mounted volumes before starting prometheus - initContainers: [] - - ## PortName to use for Prometheus. - ## - portName: "http-web" - - ## ArbitraryFSAccessThroughSMs configures whether configuration based on a service monitor can access arbitrary files - ## on the file system of the Prometheus container e.g. bearer token files. - arbitraryFSAccessThroughSMs: false - - ## OverrideHonorLabels if set to true overrides all user configured honor_labels. If HonorLabels is set in ServiceMonitor - ## or PodMonitor to true, this overrides honor_labels to false. - overrideHonorLabels: false - - ## OverrideHonorTimestamps allows to globally enforce honoring timestamps in all scrape configs. - overrideHonorTimestamps: false - - ## IgnoreNamespaceSelectors if set to true will ignore NamespaceSelector settings from the podmonitor and servicemonitor - ## configs, and they will only discover endpoints within their current namespace. Defaults to false. - ignoreNamespaceSelectors: false - - ## EnforcedNamespaceLabel enforces adding a namespace label of origin for each alert and metric that is user created. - ## The label value will always be the namespace of the object that is being created. - ## Disabled by default - enforcedNamespaceLabel: "" - - ## PrometheusRulesExcludedFromEnforce - list of prometheus rules to be excluded from enforcing of adding namespace labels. - ## Works only if enforcedNamespaceLabel set to true. Make sure both ruleNamespace and ruleName are set for each pair - ## Deprecated, use `excludedFromEnforcement` instead - prometheusRulesExcludedFromEnforce: [] - - ## ExcludedFromEnforcement - list of object references to PodMonitor, ServiceMonitor, Probe and PrometheusRule objects - ## to be excluded from enforcing a namespace label of origin. - ## Works only if enforcedNamespaceLabel set to true. - ## See https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#objectreference - excludedFromEnforcement: [] - - ## QueryLogFile specifies the file to which PromQL queries are logged. Note that this location must be writable, - ## and can be persisted using an attached volume. Alternatively, the location can be set to a stdout location such - ## as /dev/stdout to log querie information to the default Prometheus log stream. This is only available in versions - ## of Prometheus >= 2.16.0. For more details, see the Prometheus docs (https://prometheus.io/docs/guides/query-log/) - queryLogFile: false - - ## EnforcedSampleLimit defines global limit on number of scraped samples that will be accepted. This overrides any SampleLimit - ## set per ServiceMonitor or/and PodMonitor. It is meant to be used by admins to enforce the SampleLimit to keep overall - ## number of samples/series under the desired limit. Note that if SampleLimit is lower that value will be taken instead. - enforcedSampleLimit: false - - ## EnforcedTargetLimit defines a global limit on the number of scraped targets. This overrides any TargetLimit set - ## per ServiceMonitor or/and PodMonitor. It is meant to be used by admins to enforce the TargetLimit to keep the overall - ## number of targets under the desired limit. Note that if TargetLimit is lower, that value will be taken instead, except - ## if either value is zero, in which case the non-zero value will be used. If both values are zero, no limit is enforced. - enforcedTargetLimit: false - - - ## Per-scrape limit on number of labels that will be accepted for a sample. If more than this number of labels are present - ## post metric-relabeling, the entire scrape will be treated as failed. 0 means no limit. Only valid in Prometheus versions - ## 2.27.0 and newer. - enforcedLabelLimit: false - - ## Per-scrape limit on length of labels name that will be accepted for a sample. If a label name is longer than this number - ## post metric-relabeling, the entire scrape will be treated as failed. 0 means no limit. Only valid in Prometheus versions - ## 2.27.0 and newer. - enforcedLabelNameLengthLimit: false - - ## Per-scrape limit on length of labels value that will be accepted for a sample. If a label value is longer than this - ## number post metric-relabeling, the entire scrape will be treated as failed. 0 means no limit. Only valid in Prometheus - ## versions 2.27.0 and newer. - enforcedLabelValueLengthLimit: false - - ## AllowOverlappingBlocks enables vertical compaction and vertical query merge in Prometheus. This is still experimental - ## in Prometheus so it may change in any upcoming release. - allowOverlappingBlocks: false - - ## Minimum number of seconds for which a newly created pod should be ready without any of its container crashing for it to - ## be considered available. Defaults to 0 (pod will be considered available as soon as it is ready). - minReadySeconds: 0 - - # Required for use in managed kubernetes clusters (such as AWS EKS) with custom CNI (such as calico), - # because control-plane managed by AWS cannot communicate with pods' IP CIDR and admission webhooks are not working - # Use the host's network namespace if true. Make sure to understand the security implications if you want to enable it. - # When hostNetwork is enabled, this will set dnsPolicy to ClusterFirstWithHostNet automatically. - hostNetwork: false - - # HostAlias holds the mapping between IP and hostnames that will be injected - # as an entry in the pod’s hosts file. - hostAliases: [] - # - ip: 10.10.0.100 - # hostnames: - # - a1.app.local - # - b1.app.local - - additionalRulesForClusterRole: [] - # - apiGroups: [ "" ] - # resources: - # - nodes/proxy - # verbs: [ "get", "list", "watch" ] - - additionalServiceMonitors: [] - ## Name of the ServiceMonitor to create - ## - # - name: "" - - ## Additional labels to set used for the ServiceMonitorSelector. Together with standard labels from - ## the chart - ## - # additionalLabels: {} - - ## Service label for use in assembling a job name of the form

    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%0DF5wI9fSLX;M6@dlaJZHjiyO8Ww>6*bPgAYPG4h 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