Merge pull request #862 from paulfantom/alertmanager-global

Remove mutating global state in alertmanager objects
This commit is contained in:
Paweł Krupa 2021-01-07 11:13:25 +01:00 committed by GitHub
commit 6248e73890
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 162 additions and 155 deletions

View File

@ -1,163 +1,163 @@
{ local defaults = {
_config+:: { local defaults = self,
namespace: 'default', namespace: error 'must provide namespace',
image: error 'must provide image',
versions+:: { version: error 'must provide version',
alertmanager: 'v0.21.0', resources: {},
commonLabels:: {
'app.kubernetes.io/name': 'alertmanager',
'app.kubernetes.io/version': defaults.version,
'app.kubernetes.io/component': 'alert-router',
'app.kubernetes.io/part-of': 'kube-prometheus',
},
selectorLabels:: {
[labelName]: defaults.commonLabels[labelName]
for labelName in std.objectFields(defaults.commonLabels)
if !std.setMember(labelName, ['app.kubernetes.io/version'])
},
name: error 'must provide name',
config: {
global: {
resolve_timeout: '5m',
}, },
inhibit_rules: [{
imageRepos+:: { source_match: {
alertmanager: 'quay.io/prometheus/alertmanager', severity: 'critical',
},
target_match_re: {
severity: 'warning|info',
},
equal: ['namespace', 'alertname'],
}, {
source_match: {
severity: 'warning',
},
target_match_re: {
severity: 'info',
},
equal: ['namespace', 'alertname'],
}],
route: {
group_by: ['namespace'],
group_wait: '30s',
group_interval: '5m',
repeat_interval: '12h',
receiver: 'Default',
routes: [
{ receiver: 'Watchdog', match: { alertname: 'Watchdog' } },
{ receiver: 'Critical', match: { severity: 'critical' } },
],
}, },
receivers: [
{ name: 'Default' },
{ name: 'Watchdog' },
{ name: 'Critical' },
],
},
replicas: 3,
};
alertmanager+:: {
name: 'main',
config: {
global: { function(params) {
resolve_timeout: '5m', local am = self,
}, config:: defaults + params,
inhibit_rules: [{ // Safety check
source_match: { assert std.isObject(am.config.resources),
severity: 'critical',
}, secret: {
target_match_re: { apiVersion: 'v1',
severity: 'warning|info', kind: 'Secret',
}, type: 'Opaque',
equal: ['namespace', 'alertname'], metadata: {
}, { name: 'alertmanager-' + am.config.name,
source_match: { namespace: am.config.namespace,
severity: 'warning', labels: { alertmanager: am.config.name } + am.config.commonLabels,
}, },
target_match_re: { stringData: {
severity: 'info', 'alertmanager.yaml': if std.type(am.config.config) == 'object'
}, then
equal: ['namespace', 'alertname'], std.manifestYamlDoc(am.config.config)
}], else
route: { am.config.config,
group_by: ['namespace'],
group_wait: '30s',
group_interval: '5m',
repeat_interval: '12h',
receiver: 'Default',
routes: [
{ receiver: 'Watchdog', match: { alertname: 'Watchdog' } },
{ receiver: 'Critical', match: { severity: 'critical' } },
],
},
receivers: [
{ name: 'Default' },
{ name: 'Watchdog' },
{ name: 'Critical' },
],
},
replicas: 3,
labels: {
'app.kubernetes.io/name': 'alertmanager',
'app.kubernetes.io/version': $._config.versions.alertmanager,
'app.kubernetes.io/component': 'alert-router',
'app.kubernetes.io/part-of': 'kube-prometheus',
},
selectorLabels: {
[labelName]: $._config.alertmanager.labels[labelName]
for labelName in std.objectFields($._config.alertmanager.labels)
if !std.setMember(labelName, ['app.kubernetes.io/version'])
},
}, },
}, },
alertmanager+:: { serviceAccount: {
secret: { apiVersion: 'v1',
apiVersion: 'v1', kind: 'ServiceAccount',
kind: 'Secret', metadata: {
type: 'Opaque', name: 'alertmanager-' + am.config.name,
metadata: { namespace: am.config.namespace,
name: 'alertmanager-' + $._config.alertmanager.name, labels: { alertmanager: am.config.name } + am.config.commonLabels,
namespace: $._config.namespace,
labels: { alertmanager: $._config.alertmanager.name } + $._config.alertmanager.labels,
},
stringData: {
'alertmanager.yaml': if std.type($._config.alertmanager.config) == 'object'
then
std.manifestYamlDoc($._config.alertmanager.config)
else
$._config.alertmanager.config,
},
}, },
},
serviceAccount: { service: {
apiVersion: 'v1', apiVersion: 'v1',
kind: 'ServiceAccount', kind: 'Service',
metadata: { metadata: {
name: 'alertmanager-' + $._config.alertmanager.name, name: 'alertmanager-' + am.config.name,
namespace: $._config.namespace, namespace: am.config.namespace,
labels: { alertmanager: $._config.alertmanager.name } + $._config.alertmanager.labels, labels: { alertmanager: am.config.name } + am.config.commonLabels,
},
}, },
spec: {
service: { ports: [
apiVersion: 'v1', { name: 'web', targetPort: 'web', port: 9093 },
kind: 'Service', ],
metadata: { selector: {
name: 'alertmanager-' + $._config.alertmanager.name, app: 'alertmanager',
namespace: $._config.namespace, alertmanager: am.config.name,
labels: { alertmanager: $._config.alertmanager.name } + $._config.alertmanager.labels, } + am.config.selectorLabels,
}, sessionAffinity: 'ClientIP',
spec: {
ports: [
{ name: 'web', targetPort: 'web', port: 9093 },
],
selector: {
app: 'alertmanager',
alertmanager: $._config.alertmanager.name,
} + $._config.alertmanager.selectorLabels,
sessionAffinity: 'ClientIP',
},
}, },
},
serviceMonitor: { serviceMonitor: {
apiVersion: 'monitoring.coreos.com/v1', apiVersion: 'monitoring.coreos.com/v1',
kind: 'ServiceMonitor', kind: 'ServiceMonitor',
metadata: { metadata: {
name: 'alertmanager', name: 'alertmanager',
namespace: $._config.namespace, namespace: am.config.namespace,
labels: $._config.alertmanager.labels, labels: am.config.commonLabels,
},
spec: {
selector: {
matchLabels: {
alertmanager: $._config.alertmanager.name,
} + $._config.alertmanager.selectorLabels,
},
endpoints: [
{ port: 'web', interval: '30s' },
],
},
}, },
spec: {
alertmanager: { selector: {
apiVersion: 'monitoring.coreos.com/v1', matchLabels: {
kind: 'Alertmanager', alertmanager: am.config.name,
metadata: { } + am.config.selectorLabels,
name: $._config.alertmanager.name,
namespace: $._config.namespace,
labels: {
alertmanager: $._config.alertmanager.name,
} + $._config.alertmanager.labels,
}, },
spec: { endpoints: [
replicas: $._config.alertmanager.replicas, { port: 'web', interval: '30s' },
version: $._config.versions.alertmanager, ],
image: $._config.imageRepos.alertmanager + ':' + $._config.versions.alertmanager, },
podMetadata: { },
labels: $._config.alertmanager.labels,
}, alertmanager: {
nodeSelector: { 'kubernetes.io/os': 'linux' }, apiVersion: 'monitoring.coreos.com/v1',
serviceAccountName: 'alertmanager-' + $._config.alertmanager.name, kind: 'Alertmanager',
securityContext: { metadata: {
runAsUser: 1000, name: am.config.name,
runAsNonRoot: true, namespace: am.config.namespace,
fsGroup: 2000, labels: {
}, alertmanager: am.config.name,
} + am.config.commonLabels,
},
spec: {
replicas: am.config.replicas,
version: am.config.version,
image: am.config.image,
podMetadata: {
labels: am.config.commonLabels,
},
resources: am.config.resources,
nodeSelector: { 'kubernetes.io/os': 'linux' },
serviceAccountName: 'alertmanager-' + am.config.name,
securityContext: {
runAsUser: 1000,
runAsNonRoot: true,
fsGroup: 2000,
}, },
}, },
}, },

View File

@ -1,13 +1,13 @@
local kubeRbacProxyContainer = import './kube-rbac-proxy/containerMixin.libsonnet'; local kubeRbacProxyContainer = import './kube-rbac-proxy/containerMixin.libsonnet';
local nodeExporter = import './node-exporter/node-exporter.libsonnet'; local nodeExporter = import './node-exporter/node-exporter.libsonnet';
local alertmanager = import './alertmanager/alertmanager.libsonnet';
(import 'github.com/brancz/kubernetes-grafana/grafana/grafana.libsonnet') + (import 'github.com/brancz/kubernetes-grafana/grafana/grafana.libsonnet') +
(import './kube-state-metrics/kube-state-metrics.libsonnet') + (import './kube-state-metrics/kube-state-metrics.libsonnet') +
(import 'github.com/kubernetes/kube-state-metrics/jsonnet/kube-state-metrics-mixin/mixin.libsonnet') + (import 'github.com/kubernetes/kube-state-metrics/jsonnet/kube-state-metrics-mixin/mixin.libsonnet') +
(import 'github.com/prometheus/node_exporter/docs/node-mixin/mixin.libsonnet') + (import 'github.com/prometheus/node_exporter/docs/node-mixin/mixin.libsonnet') +
(import './blackbox-exporter/blackbox-exporter.libsonnet') + (import './blackbox-exporter/blackbox-exporter.libsonnet') +
(import './alertmanager/alertmanager.libsonnet') +
(import 'github.com/prometheus/alertmanager/doc/alertmanager-mixin/mixin.libsonnet') + (import 'github.com/prometheus/alertmanager/doc/alertmanager-mixin/mixin.libsonnet') +
(import 'github.com/prometheus-operator/prometheus-operator/jsonnet/prometheus-operator/prometheus-operator.libsonnet') + (import 'github.com/prometheus-operator/prometheus-operator/jsonnet/prometheus-operator/prometheus-operator.libsonnet') +
(import 'github.com/prometheus-operator/prometheus-operator/jsonnet/mixin/mixin.libsonnet') + (import 'github.com/prometheus-operator/prometheus-operator/jsonnet/mixin/mixin.libsonnet') +
@ -23,6 +23,12 @@ local nodeExporter = import './node-exporter/node-exporter.libsonnet';
version: '1.0.1', version: '1.0.1',
image: 'quay.io/prometheus/node-exporter:v1.0.1', image: 'quay.io/prometheus/node-exporter:v1.0.1',
}), }),
alertmanager: alertmanager({
name: 'main',
namespace: $._config.namespace,
version: '0.21.0',
image: 'quay.io/prometheus/alertmanager:v0.21.0',
}),
kubePrometheus+:: { kubePrometheus+:: {
namespace: { namespace: {
apiVersion: 'v1', apiVersion: 'v1',

View File

@ -6,7 +6,7 @@ metadata:
app.kubernetes.io/component: alert-router app.kubernetes.io/component: alert-router
app.kubernetes.io/name: alertmanager app.kubernetes.io/name: alertmanager
app.kubernetes.io/part-of: kube-prometheus app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: v0.21.0 app.kubernetes.io/version: 0.21.0
name: main name: main
namespace: monitoring namespace: monitoring
spec: spec:
@ -18,11 +18,12 @@ spec:
app.kubernetes.io/component: alert-router app.kubernetes.io/component: alert-router
app.kubernetes.io/name: alertmanager app.kubernetes.io/name: alertmanager
app.kubernetes.io/part-of: kube-prometheus app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: v0.21.0 app.kubernetes.io/version: 0.21.0
replicas: 3 replicas: 3
resources: {}
securityContext: securityContext:
fsGroup: 2000 fsGroup: 2000
runAsNonRoot: true runAsNonRoot: true
runAsUser: 1000 runAsUser: 1000
serviceAccountName: alertmanager-main serviceAccountName: alertmanager-main
version: v0.21.0 version: 0.21.0

View File

@ -6,7 +6,7 @@ metadata:
app.kubernetes.io/component: alert-router app.kubernetes.io/component: alert-router
app.kubernetes.io/name: alertmanager app.kubernetes.io/name: alertmanager
app.kubernetes.io/part-of: kube-prometheus app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: v0.21.0 app.kubernetes.io/version: 0.21.0
name: alertmanager-main name: alertmanager-main
namespace: monitoring namespace: monitoring
stringData: stringData:

View File

@ -6,7 +6,7 @@ metadata:
app.kubernetes.io/component: alert-router app.kubernetes.io/component: alert-router
app.kubernetes.io/name: alertmanager app.kubernetes.io/name: alertmanager
app.kubernetes.io/part-of: kube-prometheus app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: v0.21.0 app.kubernetes.io/version: 0.21.0
name: alertmanager-main name: alertmanager-main
namespace: monitoring namespace: monitoring
spec: spec:

View File

@ -6,6 +6,6 @@ metadata:
app.kubernetes.io/component: alert-router app.kubernetes.io/component: alert-router
app.kubernetes.io/name: alertmanager app.kubernetes.io/name: alertmanager
app.kubernetes.io/part-of: kube-prometheus app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: v0.21.0 app.kubernetes.io/version: 0.21.0
name: alertmanager-main name: alertmanager-main
namespace: monitoring namespace: monitoring

View File

@ -5,7 +5,7 @@ metadata:
app.kubernetes.io/component: alert-router app.kubernetes.io/component: alert-router
app.kubernetes.io/name: alertmanager app.kubernetes.io/name: alertmanager
app.kubernetes.io/part-of: kube-prometheus app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: v0.21.0 app.kubernetes.io/version: 0.21.0
name: alertmanager name: alertmanager
namespace: monitoring namespace: monitoring
spec: spec: