From 9e87d405baf1341a17551c7e626d0f8ed546168b Mon Sep 17 00:00:00 2001 From: Blizter Date: Tue, 27 Oct 2020 11:50:02 -0400 Subject: [PATCH 1/8] Example of 1 ingress routing to many applications --- examples/ingress-one-to-many.jsonnet | 79 ++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 examples/ingress-one-to-many.jsonnet diff --git a/examples/ingress-one-to-many.jsonnet b/examples/ingress-one-to-many.jsonnet new file mode 100644 index 00000000..7b0bc2e7 --- /dev/null +++ b/examples/ingress-one-to-many.jsonnet @@ -0,0 +1,79 @@ +local k = import 'ksonnet/ksonnet.beta.3/k.libsonnet'; +local secret = k.core.v1.secret; +local ingress = k.extensions.v1beta1.ingress; +local ingressTls = ingress.mixin.spec.tlsType; +local ingressRule = ingress.mixin.spec.rulesType; +local httpIngressPath = ingressRule.mixin.http.pathsType; + +local kp = + (import 'kube-prometheus/kube-prometheus.libsonnet') + + { + _config+:: { + namespace: 'monitoring', + grafana+:: { + config+: { + sections+: { + server+: { + root_url: 'http://grafana.example.com/', + }, + }, + }, + }, + }, + // Configure External URL's per application + alertmanager+:: { + alertmanager+: { + spec+: { + externalUrl: 'http://alertmanager.example.com', + }, + }, + }, + prometheus+:: { + prometheus+: { + spec+: { + externalUrl: 'http://prometheus.example.com', + }, + }, + }, + // Create one ingress object that routes to each individual application + ingress+:: { + 'kube-prometheus': + ingress.new() + + ingress.mixin.metadata.withName('prometheus-k8s') + + ingress.mixin.metadata.withNamespace($._config.namespace) + + ingress.mixin.metadata.withAnnotations({ + 'nginx.ingress.kubernetes.io/auth-type': 'basic', + 'nginx.ingress.kubernetes.io/auth-secret': 'basic-auth', + 'nginx.ingress.kubernetes.io/auth-realm': 'Authentication Required', + }) + + ingress.mixin.spec.withRules([ + ingressRule.new() + + ingressRule.withHost('prometheus.dev.kepler-ops.io') + + ingressRule.mixin.http.withPaths( + httpIngressPath.new() + + httpIngressPath.mixin.backend.withServiceName('prometheus-k8s') + + httpIngressPath.mixin.backend.withServicePort('web') + ) , + ingressRule.withHost('alertmanager.example.com') + + ingressRule.mixin.http.withPaths( + httpIngressPath.new() + + httpIngressPath.mixin.backend.withServiceName('alertmanager-main') + + httpIngressPath.mixin.backend.withServicePort('web') + ), + ingressRule.withHost('grafana.example.com') + + ingressRule.mixin.http.withPaths( + httpIngressPath.new() + + httpIngressPath.mixin.backend.withServiceName('grafana') + + httpIngressPath.mixin.backend.withServicePort('http') + )] + ), + }, + { + // Create basic auth secret - replace 'auth' file with your own + ingress+:: { + 'basic-auth-secret': + secret.new('basic-auth', { auth: std.base64(importstr 'auth') }) + + secret.mixin.metadata.withNamespace($._config.namespace), + }, + }; + +{ [name + '-ingress']: kp.ingress[name] for name in std.objectFields(kp.ingress) } From 468e63267b0a467fa212119a5ad805d9d9c765d3 Mon Sep 17 00:00:00 2001 From: Blizter Date: Tue, 27 Oct 2020 15:53:09 -0400 Subject: [PATCH 2/8] adding missing brace --- examples/ingress-one-to-many.jsonnet | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/ingress-one-to-many.jsonnet b/examples/ingress-one-to-many.jsonnet index 7b0bc2e7..f5774af4 100644 --- a/examples/ingress-one-to-many.jsonnet +++ b/examples/ingress-one-to-many.jsonnet @@ -67,13 +67,14 @@ local kp = httpIngressPath.mixin.backend.withServicePort('http') )] ), - }, + { + }, + } + { // Create basic auth secret - replace 'auth' file with your own ingress+:: { 'basic-auth-secret': secret.new('basic-auth', { auth: std.base64(importstr 'auth') }) + secret.mixin.metadata.withNamespace($._config.namespace), - }, + }, }; { [name + '-ingress']: kp.ingress[name] for name in std.objectFields(kp.ingress) } From 8b3fb3e2c58d622a35ae53036ee73a6cab249e6c Mon Sep 17 00:00:00 2001 From: Blizter Date: Thu, 12 Nov 2020 10:05:26 -0500 Subject: [PATCH 3/8] removing ksonnet --- examples/ingress-one-to-many.jsonnet | 109 +++++++++++++++++---------- 1 file changed, 69 insertions(+), 40 deletions(-) diff --git a/examples/ingress-one-to-many.jsonnet b/examples/ingress-one-to-many.jsonnet index f5774af4..96b28d41 100644 --- a/examples/ingress-one-to-many.jsonnet +++ b/examples/ingress-one-to-many.jsonnet @@ -1,9 +1,17 @@ -local k = import 'ksonnet/ksonnet.beta.3/k.libsonnet'; -local secret = k.core.v1.secret; -local ingress = k.extensions.v1beta1.ingress; -local ingressTls = ingress.mixin.spec.tlsType; -local ingressRule = ingress.mixin.spec.rulesType; -local httpIngressPath = ingressRule.mixin.http.pathsType; +local ingress(name, namespace, rules) = { + apiVersion: 'networking.k8s.io/v1', + kind: 'Ingress', + metadata: { + name: name, + namespace: namespace, + annotations: { + 'nginx.ingress.kubernetes.io/auth-type': 'basic', + 'nginx.ingress.kubernetes.io/auth-secret': 'basic-auth', + 'nginx.ingress.kubernetes.io/auth-realm': 'Authentication Required', + }, + }, + spec: { rules: rules }, +}; local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + @@ -37,44 +45,65 @@ local kp = }, // Create one ingress object that routes to each individual application ingress+:: { - 'kube-prometheus': - ingress.new() + - ingress.mixin.metadata.withName('prometheus-k8s') + - ingress.mixin.metadata.withNamespace($._config.namespace) + - ingress.mixin.metadata.withAnnotations({ - 'nginx.ingress.kubernetes.io/auth-type': 'basic', - 'nginx.ingress.kubernetes.io/auth-secret': 'basic-auth', - 'nginx.ingress.kubernetes.io/auth-realm': 'Authentication Required', - }) + - ingress.mixin.spec.withRules([ - ingressRule.new() + - ingressRule.withHost('prometheus.dev.kepler-ops.io') + - ingressRule.mixin.http.withPaths( - httpIngressPath.new() + - httpIngressPath.mixin.backend.withServiceName('prometheus-k8s') + - httpIngressPath.mixin.backend.withServicePort('web') - ) , - ingressRule.withHost('alertmanager.example.com') + - ingressRule.mixin.http.withPaths( - httpIngressPath.new() + - httpIngressPath.mixin.backend.withServiceName('alertmanager-main') + - httpIngressPath.mixin.backend.withServicePort('web') - ), - ingressRule.withHost('grafana.example.com') + - ingressRule.mixin.http.withPaths( - httpIngressPath.new() + - httpIngressPath.mixin.backend.withServiceName('grafana') + - httpIngressPath.mixin.backend.withServicePort('http') - )] - ), + 'kube-prometheus': ingress( + 'kube-prometheus', + $._config.namespace, + [{ + host: 'alertmanager.example.com', + http: { + paths: [{ + backend: { + service: { + name: 'alertmanager-main', + port: 'web', + }, + }, + }], + }, + }, + { + host: 'grafana.example.com', + http: { + paths: [{ + backend: { + service: { + name: 'grafana', + port: 'http', + }, + }, + }], + }, + }, + { + host: 'alertmanager.example.com', + http: { + paths: [{ + backend: { + service: { + name: 'prometheus-k8s', + port: 'web', + }, + }, + }], + }, + },] + ), + }, } + { // Create basic auth secret - replace 'auth' file with your own ingress+:: { - 'basic-auth-secret': - secret.new('basic-auth', { auth: std.base64(importstr 'auth') }) + - secret.mixin.metadata.withNamespace($._config.namespace), - }, + 'basic-auth-secret': { + apiVersion: 'v1', + kind: 'Secret', + metadata: { + name: 'basic-auth', + namespace: $._config.namespace, + }, + data: { auth: std.base64(importstr 'auth') }, + type: 'Opaque', + }, + }, }; { [name + '-ingress']: kp.ingress[name] for name in std.objectFields(kp.ingress) } From a01820692c66f767186ac7b2ecc570a827e67fd1 Mon Sep 17 00:00:00 2001 From: Blizter Date: Thu, 26 Nov 2020 12:54:35 -0500 Subject: [PATCH 4/8] example external custom alertmanager template --- examples/alertmanager-alert-template.tmpl | 37 +++++++++++++++++++ ...rtmanager-config-template-external.jsonnet | 28 ++++++++++++++ .../alertmanager-config-with-template.yaml | 27 ++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 examples/alertmanager-alert-template.tmpl create mode 100644 examples/alertmanager-config-template-external.jsonnet create mode 100644 examples/alertmanager-config-with-template.yaml diff --git a/examples/alertmanager-alert-template.tmpl b/examples/alertmanager-alert-template.tmpl new file mode 100644 index 00000000..38196daf --- /dev/null +++ b/examples/alertmanager-alert-template.tmpl @@ -0,0 +1,37 @@ +# to know more about custom template language read alertmanager documentation +# inspired by : https://gist.github.com/milesbxf/e2744fc90e9c41b47aa47925f8ff6512 + +{{ define "slack.title" -}} + [{{ .Status | toUpper -}} + {{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{- end -}} + ] {{ template "__alert_severity_prefix_title" . }} {{ .CommonLabels.alertname }} +{{- end }} + +{{ define "slack.color" -}} + {{ if eq .Status "firing" -}} + {{ if eq .CommonLabels.severity "warning" -}} + warning + {{- else if eq .CommonLabels.severity "critical" -}} + danger + {{- else -}} + #439FE0 + {{- end -}} + {{ else -}} + good + {{- end }} +{{- end }} + +{{ define "slack.icon_emoji" }}:prometheus:{{ end }} + +{{/* The test to display in the alert */}} + {{ define "slack.text" -}} + {{ range .Alerts }} + {{- if .Annotations.message }} + {{ .Annotations.message }} + {{- end }} + {{- if .Annotations.description }} + {{ .Annotations.description }} + {{- end }} + {{- end }} +{{- end }} + diff --git a/examples/alertmanager-config-template-external.jsonnet b/examples/alertmanager-config-template-external.jsonnet new file mode 100644 index 00000000..e32501c3 --- /dev/null +++ b/examples/alertmanager-config-template-external.jsonnet @@ -0,0 +1,28 @@ +local configmap(name, namespace, data) = { + apiVersion: "v1", + kind: "ConfigMap", + metadate : { + name: name, + namespace: namespace, + }, + data: data, + }; + +local kp = + // different libsonnet imported + { + configmap+:: { + 'alert-templates': configmap( + 'alertmanager-alert-template.tmpl', + $._config.namespace, + {"data": importstr 'alertmanager-alert-template.tmpl'}, + ) + }, + alertmanager+:{ + spec+:{ + # the important field configmaps: + configMaps: ['alert-templates',], # goes to etc/alermanager/configmaps + }, + }, +}; +{ [name + '-configmap']: kp.configmap[name] for name in std.objectFields(kp.configmap) } diff --git a/examples/alertmanager-config-with-template.yaml b/examples/alertmanager-config-with-template.yaml new file mode 100644 index 00000000..b574b666 --- /dev/null +++ b/examples/alertmanager-config-with-template.yaml @@ -0,0 +1,27 @@ +# external alertmanager yaml +global: + resolve_timeout: 10m + slack_api_url: url +route: + group_by: ['job'] + group_wait: 30s + group_interval: 5m + repeat_interval: 12h + receiver: 'null' + routes: + - match: + alertname: Watchdog + receiver: 'null' +receivers: +- name: 'null' +- name: slack +slack_configs: +- channel: '#alertmanager-testing' + send_resolved: true + title: '{{ template "slack.title" . }}' + icon_emoji: '{{ template "slack.icon_emoji" . }}' + color: '{{ template "slack.color" . }}' + text: '{{ template "slack.text" . }} + +templates: +- '/etc/alertmanager/configmaps/alertmanager-alert-template.tmpl' From 24f444fc76a3ef437f19178cb509e879c7d25dc8 Mon Sep 17 00:00:00 2001 From: Blizter Date: Sat, 23 Oct 2021 12:39:36 -0400 Subject: [PATCH 5/8] fix typo in local confgimap metadata --- examples/alertmanager-config-template-external.jsonnet | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/alertmanager-config-template-external.jsonnet b/examples/alertmanager-config-template-external.jsonnet index e32501c3..420c34d5 100644 --- a/examples/alertmanager-config-template-external.jsonnet +++ b/examples/alertmanager-config-template-external.jsonnet @@ -1,20 +1,20 @@ local configmap(name, namespace, data) = { apiVersion: "v1", kind: "ConfigMap", - metadate : { + metadata : { name: name, namespace: namespace, }, data: data, }; -local kp = +local kp = // different libsonnet imported { configmap+:: { 'alert-templates': configmap( 'alertmanager-alert-template.tmpl', - $._config.namespace, + $._config.namespace, {"data": importstr 'alertmanager-alert-template.tmpl'}, ) }, From 1ffd6dfb30cc6210703d010b980b498f90bdae16 Mon Sep 17 00:00:00 2001 From: Blizter Date: Sun, 24 Oct 2021 09:31:28 -0400 Subject: [PATCH 6/8] let example generate --- ...rtmanager-config-template-external.jsonnet | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/examples/alertmanager-config-template-external.jsonnet b/examples/alertmanager-config-template-external.jsonnet index 420c34d5..73b3ee4f 100644 --- a/examples/alertmanager-config-template-external.jsonnet +++ b/examples/alertmanager-config-template-external.jsonnet @@ -1,28 +1,35 @@ local configmap(name, namespace, data) = { - apiVersion: "v1", - kind: "ConfigMap", - metadata : { - name: name, - namespace: namespace, - }, - data: data, - }; + apiVersion: 'v1', + kind: 'ConfigMap', + metadata: { + name: name, + namespace: namespace, + }, + data: data, +}; local kp = - // different libsonnet imported + // different libsonnet imported { - configmap+:: { - 'alert-templates': configmap( - 'alertmanager-alert-template.tmpl', - $._config.namespace, - {"data": importstr 'alertmanager-alert-template.tmpl'}, - ) + values+:: { + common+: { + namespace: 'monitoring', }, - alertmanager+:{ - spec+:{ - # the important field configmaps: - configMaps: ['alert-templates',], # goes to etc/alermanager/configmaps - }, + }, + alertmanager+:: { + alertmanager+: { + spec+: { + // the important field configmaps: + configMaps: ['alert-templates'], // goes to etc/alermanager/configmaps + }, }, -}; + }, + configmap+:: { + 'alert-templates': configmap( + 'alertmanager-alert-template.tmpl', + $.values.common.namespace, // could be $._config.namespace to assign namespace once + { data: importstr 'alertmanager-alert-template.tmpl' }, + ), + }, + }; { [name + '-configmap']: kp.configmap[name] for name in std.objectFields(kp.configmap) } From d4b8fff27640a1aa56bdc61b649f6d3a4f027d8b Mon Sep 17 00:00:00 2001 From: Blizter Date: Sun, 24 Oct 2021 09:34:01 -0400 Subject: [PATCH 7/8] import main.libsonnet to allow exmaple generation --- examples/ingress-one-to-many.jsonnet | 72 ++++++++++++++-------------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/examples/ingress-one-to-many.jsonnet b/examples/ingress-one-to-many.jsonnet index 96b28d41..ee56090f 100644 --- a/examples/ingress-one-to-many.jsonnet +++ b/examples/ingress-one-to-many.jsonnet @@ -14,7 +14,7 @@ local ingress(name, namespace, rules) = { }; local kp = - (import 'kube-prometheus/kube-prometheus.libsonnet') + + (import 'kube-prometheus/main.libsonnet') + { _config+:: { namespace: 'monitoring', @@ -48,47 +48,49 @@ local kp = 'kube-prometheus': ingress( 'kube-prometheus', $._config.namespace, - [{ - host: 'alertmanager.example.com', - http: { - paths: [{ - backend: { - service: { - name: 'alertmanager-main', - port: 'web', + [ + { + host: 'alertmanager.example.com', + http: { + paths: [{ + backend: { + service: { + name: 'alertmanager-main', + port: 'web', + }, }, - }, - }], + }], + }, }, - }, - { - host: 'grafana.example.com', - http: { - paths: [{ - backend: { - service: { - name: 'grafana', - port: 'http', + { + host: 'grafana.example.com', + http: { + paths: [{ + backend: { + service: { + name: 'grafana', + port: 'http', + }, }, - }, - }], + }], + }, }, - }, - { - host: 'alertmanager.example.com', - http: { - paths: [{ - backend: { - service: { - name: 'prometheus-k8s', - port: 'web', + { + host: 'alertmanager.example.com', + http: { + paths: [{ + backend: { + service: { + name: 'prometheus-k8s', + port: 'web', + }, }, - }, - }], + }], + }, }, - },] + ] ), - + }, } + { // Create basic auth secret - replace 'auth' file with your own From 00ab4812c84a89e2541ee7e49647040c4b35eef2 Mon Sep 17 00:00:00 2001 From: Blizter Date: Sun, 24 Oct 2021 09:35:03 -0400 Subject: [PATCH 8/8] update import statement --- sync-to-internal-registry.jsonnet | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sync-to-internal-registry.jsonnet b/sync-to-internal-registry.jsonnet index 88446d0b..c530175a 100644 --- a/sync-to-internal-registry.jsonnet +++ b/sync-to-internal-registry.jsonnet @@ -1,5 +1,5 @@ -local kp = import 'kube-prometheus/main.libsonnet'; local l = import 'kube-prometheus/addons/config-mixins.libsonnet'; +local kp = import 'kube-prometheus/main.libsonnet'; local config = kp.values.common; local makeImages(config) = [