Merge pull request #875 from paulfantom/directory-layout

Simplify directory structure
This commit is contained in:
Paweł Krupa
2021-01-21 18:36:21 +01:00
committed by GitHub
87 changed files with 789 additions and 680 deletions

121
README.md
View File

@@ -207,15 +207,15 @@ Here's [example.jsonnet](example.jsonnet):
[embedmd]:# (example.jsonnet) [embedmd]:# (example.jsonnet)
```jsonnet ```jsonnet
local kp = local kp =
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
// Uncomment the following imports to enable its patches // Uncomment the following imports to enable its patches
// (import 'kube-prometheus/kube-prometheus-anti-affinity.libsonnet') + // (import 'kube-prometheus/addons/anti-affinity.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-managed-cluster.libsonnet') + // (import 'kube-prometheus/addons/managed-cluster.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-node-ports.libsonnet') + // (import 'kube-prometheus/addons/node-ports.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-static-etcd.libsonnet') + // (import 'kube-prometheus/addons/static-etcd.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-thanos-sidecar.libsonnet') + // (import 'kube-prometheus/addons/thanos-sidecar.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-custom-metrics.libsonnet') + // (import 'kube-prometheus/addons/custom-metrics.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-external-metrics.libsonnet') + // (import 'kube-prometheus/addons/external-metrics.libsonnet') +
{ {
values+:: { values+:: {
common+: { common+: {
@@ -233,14 +233,14 @@ local kp =
{ 'prometheus-operator-serviceMonitor': kp.prometheusOperator.serviceMonitor } + { 'prometheus-operator-serviceMonitor': kp.prometheusOperator.serviceMonitor } +
{ 'prometheus-operator-prometheusRule': kp.prometheusOperator.prometheusRule } + { 'prometheus-operator-prometheusRule': kp.prometheusOperator.prometheusRule } +
{ 'kube-prometheus-prometheusRule': kp.kubePrometheus.prometheusRule } + { 'kube-prometheus-prometheusRule': kp.kubePrometheus.prometheusRule } +
{ ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } +
{ ['blackbox-exporter-' + name]: kp.blackboxExporter[name] for name in std.objectFields(kp.blackboxExporter) } +
{ ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } +
{ ['alertmanager-' + name]: kp.alertmanager[name] for name in std.objectFields(kp.alertmanager) } + { ['alertmanager-' + name]: kp.alertmanager[name] for name in std.objectFields(kp.alertmanager) } +
{ ['prometheus-' + name]: kp.prometheus[name] for name in std.objectFields(kp.prometheus) } + { ['blackbox-exporter-' + name]: kp.blackboxExporter[name] for name in std.objectFields(kp.blackboxExporter) } +
{ ['prometheus-adapter-' + name]: kp.prometheusAdapter[name] for name in std.objectFields(kp.prometheusAdapter) } +
{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } + { ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } +
{ ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } +
{ ['kubernetes-' + name]: kp.kubernetesMixin[name] for name in std.objectFields(kp.kubernetesMixin) } { ['kubernetes-' + name]: kp.kubernetesMixin[name] for name in std.objectFields(kp.kubernetesMixin) }
{ ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } +
{ ['prometheus-' + name]: kp.prometheus[name] for name in std.objectFields(kp.prometheus) } +
{ ['prometheus-adapter-' + name]: kp.prometheusAdapter[name] for name in std.objectFields(kp.prometheusAdapter) }
``` ```
And here's the [build.sh](build.sh) script (which uses `vendor/` to render all manifests in a json structure of `{filename: manifest-content}`): And here's the [build.sh](build.sh) script (which uses `vendor/` to render all manifests in a json structure of `{filename: manifest-content}`):
@@ -413,24 +413,24 @@ kubeadm:
[embedmd]:# (examples/jsonnet-snippets/kubeadm.jsonnet) [embedmd]:# (examples/jsonnet-snippets/kubeadm.jsonnet)
```jsonnet ```jsonnet
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-kubeadm.libsonnet') (import 'kube-prometheus/platforms/kubeadm.libsonnet')
``` ```
bootkube: bootkube:
[embedmd]:# (examples/jsonnet-snippets/bootkube.jsonnet) [embedmd]:# (examples/jsonnet-snippets/bootkube.jsonnet)
```jsonnet ```jsonnet
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-bootkube.libsonnet') (import 'kube-prometheus/platforms/bootkube.libsonnet')
``` ```
kops: kops:
[embedmd]:# (examples/jsonnet-snippets/kops.jsonnet) [embedmd]:# (examples/jsonnet-snippets/kops.jsonnet)
```jsonnet ```jsonnet
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-kops.libsonnet') (import 'kube-prometheus/platforms/kops.libsonnet')
``` ```
kops with CoreDNS: kops with CoreDNS:
@@ -439,25 +439,25 @@ If your kops cluster is using CoreDNS, there is an additional mixin to import.
[embedmd]:# (examples/jsonnet-snippets/kops-coredns.jsonnet) [embedmd]:# (examples/jsonnet-snippets/kops-coredns.jsonnet)
```jsonnet ```jsonnet
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-kops.libsonnet') + (import 'kube-prometheus/platforms/kops.libsonnet') +
(import 'kube-prometheus/kube-prometheus-kops-coredns.libsonnet') (import 'kube-prometheus/platforms/kops-coredns.libsonnet')
``` ```
kubespray: kubespray:
[embedmd]:# (examples/jsonnet-snippets/kubespray.jsonnet) [embedmd]:# (examples/jsonnet-snippets/kubespray.jsonnet)
```jsonnet ```jsonnet
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-kubespray.libsonnet') (import 'kube-prometheus/platforms/kubespray.libsonnet')
``` ```
kube-aws: aws:
[embedmd]:# (examples/jsonnet-snippets/kube-aws.jsonnet) [embedmd]:# (examples/jsonnet-snippets/aws.jsonnet)
```jsonnet ```jsonnet
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-kube-aws.libsonnet') (import 'kube-prometheus/platforms/aws.libsonnet')
``` ```
### Internal Registry ### Internal Registry
@@ -483,10 +483,12 @@ Then to generate manifests with `internal-registry.com/organization`, use the `w
[embedmd]:# (examples/internal-registry.jsonnet) [embedmd]:# (examples/internal-registry.jsonnet)
```jsonnet ```jsonnet
local mixin = import 'kube-prometheus/kube-prometheus-config-mixins.libsonnet'; local mixin = import 'kube-prometheus/addons/config-mixins.libsonnet';
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
}, },
} + mixin.withImageRepository('internal-registry.com/organization'); } + mixin.withImageRepository('internal-registry.com/organization');
@@ -505,8 +507,8 @@ Another mixin that may be useful for exploring the stack is to expose the UIs of
[embedmd]:# (examples/jsonnet-snippets/node-ports.jsonnet) [embedmd]:# (examples/jsonnet-snippets/node-ports.jsonnet)
```jsonnet ```jsonnet
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-node-ports.libsonnet') (import 'kube-prometheus/addons/node-ports.libsonnet')
``` ```
### Prometheus Object Name ### Prometheus Object Name
@@ -515,7 +517,7 @@ To give another customization example, the name of the `Prometheus` object provi
[embedmd]:# (examples/prometheus-name-override.jsonnet) [embedmd]:# (examples/prometheus-name-override.jsonnet)
```jsonnet ```jsonnet
((import 'kube-prometheus/kube-prometheus.libsonnet') + { ((import 'kube-prometheus/main.libsonnet') + {
prometheus+: { prometheus+: {
prometheus+: { prometheus+: {
metadata+: { metadata+: {
@@ -532,7 +534,7 @@ Standard Kubernetes manifests are all written using [ksonnet-lib](https://github
[embedmd]:# (examples/ksonnet-example.jsonnet) [embedmd]:# (examples/ksonnet-example.jsonnet)
```jsonnet ```jsonnet
((import 'kube-prometheus/kube-prometheus.libsonnet') + { ((import 'kube-prometheus/main.libsonnet') + {
nodeExporter+: { nodeExporter+: {
daemonset+: { daemonset+: {
metadata+: { metadata+: {
@@ -549,8 +551,8 @@ The Alertmanager configuration is located in the `_config.alertmanager.config` c
[embedmd]:# (examples/alertmanager-config.jsonnet) [embedmd]:# (examples/alertmanager-config.jsonnet)
```jsonnet ```jsonnet
((import 'kube-prometheus/kube-prometheus.libsonnet') + { ((import 'kube-prometheus/main.libsonnet') + {
_config+:: { values+:: {
alertmanager+: { alertmanager+: {
config: ||| config: |||
global: global:
@@ -577,7 +579,7 @@ In the above example the configuration has been inlined, but can just as well be
[embedmd]:# (examples/alertmanager-config-external.jsonnet) [embedmd]:# (examples/alertmanager-config-external.jsonnet)
```jsonnet ```jsonnet
((import 'kube-prometheus/kube-prometheus.libsonnet') + { ((import 'kube-prometheus/main.libsonnet') + {
_config+:: { _config+:: {
alertmanager+: { alertmanager+: {
config: importstr 'alertmanager-config.yaml', config: importstr 'alertmanager-config.yaml',
@@ -592,9 +594,11 @@ In order to monitor additional namespaces, the Prometheus server requires the ap
[embedmd]:# (examples/additional-namespaces.jsonnet) [embedmd]:# (examples/additional-namespaces.jsonnet)
```jsonnet ```jsonnet
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
prometheus+:: { prometheus+:: {
namespaces+: ['my-namespace', 'my-second-namespace'], namespaces+: ['my-namespace', 'my-second-namespace'],
@@ -621,14 +625,16 @@ You can define ServiceMonitor resources in your `jsonnet` spec. See the snippet
[embedmd]:# (examples/additional-namespaces-servicemonitor.jsonnet) [embedmd]:# (examples/additional-namespaces-servicemonitor.jsonnet)
```jsonnet ```jsonnet
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
prometheus+:: { prometheus+:: {
namespaces+: ['my-namespace', 'my-second-namespace'], namespaces+: ['my-namespace', 'my-second-namespace'],
}, },
}, },
prometheus+:: { prometheus+: {
serviceMonitorMyNamespace: { serviceMonitorMyNamespace: {
apiVersion: 'monitoring.coreos.com/v1', apiVersion: 'monitoring.coreos.com/v1',
kind: 'ServiceMonitor', kind: 'ServiceMonitor',
@@ -671,12 +677,13 @@ In case you want to monitor all namespaces in a cluster, you can add the followi
[embedmd]:# (examples/all-namespaces.jsonnet) [embedmd]:# (examples/all-namespaces.jsonnet)
```jsonnet ```jsonnet
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + local kp = (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-all-namespaces.libsonnet') + { (import 'kube-prometheus/addons/all-namespaces.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
prometheus+:: { },
prometheus+: {
namespaces: [], namespaces: [],
}, },
}, },
@@ -718,10 +725,12 @@ To do that, one can import the following mixin
[embedmd]:# (examples/strip-limits.jsonnet) [embedmd]:# (examples/strip-limits.jsonnet)
```jsonnet ```jsonnet
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + local kp = (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-strip-limits.libsonnet') + { (import 'kube-prometheus/addons/strip-limits.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
}, },
}; };

View File

@@ -7,23 +7,29 @@ One fatal issue that can occur is that you run out of IP addresses in your eks c
You can monitor the `awscni` using kube-promethus with : You can monitor the `awscni` using kube-promethus with :
[embedmd]:# (../examples/eks-cni-example.jsonnet) [embedmd]:# (../examples/eks-cni-example.jsonnet)
```jsonnet ```jsonnet
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + local kp = (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-eks.libsonnet') + { (import 'kube-prometheus/platforms/eks.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
}, },
prometheusRules+:: { prometheus+: {
groups+: [ prometheusRuleEksCNI+: {
{ spec+: {
name: 'example-group', groups+: [
rules: [
{ {
record: 'aws_eks_available_ip', name: 'example-group',
expr: 'sum by(instance) (awscni_total_ip_addresses) - sum by(instance) (awscni_assigned_ip_addresses) < 10', rules: [
{
record: 'aws_eks_available_ip',
expr: 'sum by(instance) (awscni_total_ip_addresses) - sum by(instance) (awscni_assigned_ip_addresses) < 10',
},
],
}, },
], ],
}, },
], },
}, },
}; };

View File

@@ -11,15 +11,15 @@ As a basis, all examples in this guide are based on the base example of the kube
[embedmd]:# (../example.jsonnet) [embedmd]:# (../example.jsonnet)
```jsonnet ```jsonnet
local kp = local kp =
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
// Uncomment the following imports to enable its patches // Uncomment the following imports to enable its patches
// (import 'kube-prometheus/kube-prometheus-anti-affinity.libsonnet') + // (import 'kube-prometheus/addons/anti-affinity.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-managed-cluster.libsonnet') + // (import 'kube-prometheus/addons/managed-cluster.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-node-ports.libsonnet') + // (import 'kube-prometheus/addons/node-ports.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-static-etcd.libsonnet') + // (import 'kube-prometheus/addons/static-etcd.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-thanos-sidecar.libsonnet') + // (import 'kube-prometheus/addons/thanos-sidecar.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-custom-metrics.libsonnet') + // (import 'kube-prometheus/addons/custom-metrics.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-external-metrics.libsonnet') + // (import 'kube-prometheus/addons/external-metrics.libsonnet') +
{ {
values+:: { values+:: {
common+: { common+: {
@@ -37,14 +37,14 @@ local kp =
{ 'prometheus-operator-serviceMonitor': kp.prometheusOperator.serviceMonitor } + { 'prometheus-operator-serviceMonitor': kp.prometheusOperator.serviceMonitor } +
{ 'prometheus-operator-prometheusRule': kp.prometheusOperator.prometheusRule } + { 'prometheus-operator-prometheusRule': kp.prometheusOperator.prometheusRule } +
{ 'kube-prometheus-prometheusRule': kp.kubePrometheus.prometheusRule } + { 'kube-prometheus-prometheusRule': kp.kubePrometheus.prometheusRule } +
{ ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } +
{ ['blackbox-exporter-' + name]: kp.blackboxExporter[name] for name in std.objectFields(kp.blackboxExporter) } +
{ ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } +
{ ['alertmanager-' + name]: kp.alertmanager[name] for name in std.objectFields(kp.alertmanager) } + { ['alertmanager-' + name]: kp.alertmanager[name] for name in std.objectFields(kp.alertmanager) } +
{ ['prometheus-' + name]: kp.prometheus[name] for name in std.objectFields(kp.prometheus) } + { ['blackbox-exporter-' + name]: kp.blackboxExporter[name] for name in std.objectFields(kp.blackboxExporter) } +
{ ['prometheus-adapter-' + name]: kp.prometheusAdapter[name] for name in std.objectFields(kp.prometheusAdapter) } +
{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } + { ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } +
{ ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } +
{ ['kubernetes-' + name]: kp.kubernetesMixin[name] for name in std.objectFields(kp.kubernetesMixin) } { ['kubernetes-' + name]: kp.kubernetesMixin[name] for name in std.objectFields(kp.kubernetesMixin) }
{ ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } +
{ ['prometheus-' + name]: kp.prometheus[name] for name in std.objectFields(kp.prometheus) } +
{ ['prometheus-adapter-' + name]: kp.prometheusAdapter[name] for name in std.objectFields(kp.prometheusAdapter) }
``` ```
## Prometheus rules ## Prometheus rules
@@ -59,28 +59,34 @@ The format is exactly the Prometheus format, so there should be no changes neces
[embedmd]:# (../examples/prometheus-additional-alert-rule-example.jsonnet) [embedmd]:# (../examples/prometheus-additional-alert-rule-example.jsonnet)
```jsonnet ```jsonnet
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
}, },
prometheusAlerts+:: { prometheus+: {
groups+: [ prometheusRule+: {
{ spec+: {
name: 'example-group', groups+: [
rules: [
{ {
alert: 'Watchdog', name: 'example-group',
expr: 'vector(1)', rules: [
labels: { {
severity: 'none', alert: 'Watchdog',
}, expr: 'vector(1)',
annotations: { labels: {
description: 'This is a Watchdog meant to ensure that the entire alerting pipeline is functional.', severity: 'none',
}, },
annotations: {
description: 'This is a Watchdog meant to ensure that the entire alerting pipeline is functional.',
},
},
],
}, },
], ],
}, },
], },
}, },
}; };
@@ -102,22 +108,28 @@ In order to add a recording rule, simply do the same with the `prometheusRules`
[embedmd]:# (../examples/prometheus-additional-recording-rule-example.jsonnet) [embedmd]:# (../examples/prometheus-additional-recording-rule-example.jsonnet)
```jsonnet ```jsonnet
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
}, },
prometheusRules+:: { prometheus+: {
groups+: [ prometheusRule+: {
{ spec+: {
name: 'example-group', groups+: [
rules: [
{ {
record: 'some_recording_rule_name', name: 'example-group',
expr: 'vector(1)', rules: [
{
record: 'some_recording_rule_name',
expr: 'vector(1)',
},
],
}, },
], ],
}, },
], },
}, },
}; };
@@ -149,12 +161,18 @@ Then import it in jsonnet:
[embedmd]:# (../examples/prometheus-additional-rendered-rule-example.jsonnet) [embedmd]:# (../examples/prometheus-additional-rendered-rule-example.jsonnet)
```jsonnet ```jsonnet
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
}, },
prometheusAlerts+:: { prometheus+: {
groups+: (import 'existingrule.json').groups, prometheusRule+: {
spec+: {
groups+: (import 'existingrule.json').groups,
},
},
}, },
}; };
@@ -255,7 +273,7 @@ local prometheus = grafana.prometheus;
local template = grafana.template; local template = grafana.template;
local graphPanel = grafana.graphPanel; local graphPanel = grafana.graphPanel;
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
_config+:: { _config+:: {
namespace: 'monitoring', namespace: 'monitoring',
}, },
@@ -303,7 +321,7 @@ As jsonnet is a superset of json, the jsonnet `import` function can be used to i
[embedmd]:# (../examples/grafana-additional-rendered-dashboard-example.jsonnet) [embedmd]:# (../examples/grafana-additional-rendered-dashboard-example.jsonnet)
```jsonnet ```jsonnet
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
_config+:: { _config+:: {
namespace: 'monitoring', namespace: 'monitoring',
}, },
@@ -329,7 +347,7 @@ local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + {
In case you have lots of json dashboard exported out from grafana UI the above approach is going to take lots of time to improve performance we can use `rawDashboards` field and provide it's value as json string by using `importstr` In case you have lots of json dashboard exported out from grafana UI the above approach is going to take lots of time to improve performance we can use `rawDashboards` field and provide it's value as json string by using `importstr`
[embedmd]:# (../examples/grafana-additional-rendered-dashboard-example-2.jsonnet) [embedmd]:# (../examples/grafana-additional-rendered-dashboard-example-2.jsonnet)
```jsonnet ```jsonnet
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
_config+:: { _config+:: {
namespace: 'monitoring', namespace: 'monitoring',
}, },

View File

@@ -17,36 +17,42 @@ Using kube-prometheus and kubectl you will be able install the following for mon
[embedmd]:# (../examples/weave-net-example.jsonnet) [embedmd]:# (../examples/weave-net-example.jsonnet)
```jsonnet ```jsonnet
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + local kp = (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-weave-net.libsonnet') + { (import 'kube-prometheus/addons/weave-net/weave-net.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
}, },
prometheusAlerts+:: { prometheus+: {
groups: std.map( prometheusRuleWeaveNet+: {
function(group) spec+: {
if group.name == 'weave-net' then groups: std.map(
group { function(group)
rules: std.map( if group.name == 'weave-net' then
function(rule) group {
if rule.alert == 'WeaveNetFastDPFlowsLow' then rules: std.map(
rule { function(rule)
expr: 'sum(weave_flows) < 20000', if rule.alert == 'WeaveNetFastDPFlowsLow' then
} rule {
else if rule.alert == 'WeaveNetIPAMUnreachable' then expr: 'sum(weave_flows) < 20000',
rule { }
expr: 'weave_ipam_unreachable_percentage > 25', else if rule.alert == 'WeaveNetIPAMUnreachable' then
} rule {
else expr: 'weave_ipam_unreachable_percentage > 25',
rule }
, else
group.rules rule
), ,
} group.rules
else ),
group, }
super.groups else
), group,
super.groups
),
},
},
}, },
}; };

View File

@@ -1,13 +1,13 @@
local kp = local kp =
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
// Uncomment the following imports to enable its patches // Uncomment the following imports to enable its patches
// (import 'kube-prometheus/kube-prometheus-anti-affinity.libsonnet') + // (import 'kube-prometheus/addons/anti-affinity.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-managed-cluster.libsonnet') + // (import 'kube-prometheus/addons/managed-cluster.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-node-ports.libsonnet') + // (import 'kube-prometheus/addons/node-ports.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-static-etcd.libsonnet') + // (import 'kube-prometheus/addons/static-etcd.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-thanos-sidecar.libsonnet') + // (import 'kube-prometheus/addons/thanos-sidecar.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-custom-metrics.libsonnet') + // (import 'kube-prometheus/addons/custom-metrics.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-external-metrics.libsonnet') + // (import 'kube-prometheus/addons/external-metrics.libsonnet') +
{ {
values+:: { values+:: {
common+: { common+: {
@@ -25,11 +25,11 @@ local kp =
{ 'prometheus-operator-serviceMonitor': kp.prometheusOperator.serviceMonitor } + { 'prometheus-operator-serviceMonitor': kp.prometheusOperator.serviceMonitor } +
{ 'prometheus-operator-prometheusRule': kp.prometheusOperator.prometheusRule } + { 'prometheus-operator-prometheusRule': kp.prometheusOperator.prometheusRule } +
{ 'kube-prometheus-prometheusRule': kp.kubePrometheus.prometheusRule } + { 'kube-prometheus-prometheusRule': kp.kubePrometheus.prometheusRule } +
{ ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } +
{ ['blackbox-exporter-' + name]: kp.blackboxExporter[name] for name in std.objectFields(kp.blackboxExporter) } +
{ ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } +
{ ['alertmanager-' + name]: kp.alertmanager[name] for name in std.objectFields(kp.alertmanager) } + { ['alertmanager-' + name]: kp.alertmanager[name] for name in std.objectFields(kp.alertmanager) } +
{ ['prometheus-' + name]: kp.prometheus[name] for name in std.objectFields(kp.prometheus) } + { ['blackbox-exporter-' + name]: kp.blackboxExporter[name] for name in std.objectFields(kp.blackboxExporter) } +
{ ['prometheus-adapter-' + name]: kp.prometheusAdapter[name] for name in std.objectFields(kp.prometheusAdapter) } +
{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } + { ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } +
{ ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } +
{ ['kubernetes-' + name]: kp.kubernetesMixin[name] for name in std.objectFields(kp.kubernetesMixin) } { ['kubernetes-' + name]: kp.kubernetesMixin[name] for name in std.objectFields(kp.kubernetesMixin) }
{ ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } +
{ ['prometheus-' + name]: kp.prometheus[name] for name in std.objectFields(kp.prometheus) } +
{ ['prometheus-adapter-' + name]: kp.prometheusAdapter[name] for name in std.objectFields(kp.prometheusAdapter) }

View File

@@ -1,11 +1,13 @@
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
prometheus+:: { prometheus+:: {
namespaces+: ['my-namespace', 'my-second-namespace'], namespaces+: ['my-namespace', 'my-second-namespace'],
}, },
}, },
prometheus+:: { prometheus+: {
serviceMonitorMyNamespace: { serviceMonitorMyNamespace: {
apiVersion: 'monitoring.coreos.com/v1', apiVersion: 'monitoring.coreos.com/v1',
kind: 'ServiceMonitor', kind: 'ServiceMonitor',

View File

@@ -1,6 +1,8 @@
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
prometheus+:: { prometheus+:: {
namespaces+: ['my-namespace', 'my-second-namespace'], namespaces+: ['my-namespace', 'my-second-namespace'],

View File

@@ -1,4 +1,4 @@
((import 'kube-prometheus/kube-prometheus.libsonnet') + { ((import 'kube-prometheus/main.libsonnet') + {
_config+:: { _config+:: {
alertmanager+: { alertmanager+: {
config: importstr 'alertmanager-config.yaml', config: importstr 'alertmanager-config.yaml',

View File

@@ -1,5 +1,5 @@
((import 'kube-prometheus/kube-prometheus.libsonnet') + { ((import 'kube-prometheus/main.libsonnet') + {
_config+:: { values+:: {
alertmanager+: { alertmanager+: {
config: ||| config: |||
global: global:

View File

@@ -1,9 +1,10 @@
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + local kp = (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-all-namespaces.libsonnet') + { (import 'kube-prometheus/addons/all-namespaces.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
prometheus+:: { },
prometheus+: {
namespaces: [], namespaces: [],
}, },
}, },

View File

@@ -1,7 +1,8 @@
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
values+:: {
_config+:: { common+: {
namespace: 'monitoring', namespace: 'monitoring',
},
}, },
}; };

View File

@@ -1,20 +1,26 @@
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + local kp = (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-eks.libsonnet') + { (import 'kube-prometheus/platforms/eks.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
}, },
prometheusRules+:: { prometheus+: {
groups+: [ prometheusRuleEksCNI+: {
{ spec+: {
name: 'example-group', groups+: [
rules: [
{ {
record: 'aws_eks_available_ip', name: 'example-group',
expr: 'sum by(instance) (awscni_total_ip_addresses) - sum by(instance) (awscni_assigned_ip_addresses) < 10', rules: [
{
record: 'aws_eks_available_ip',
expr: 'sum by(instance) (awscni_total_ip_addresses) - sum by(instance) (awscni_assigned_ip_addresses) < 10',
},
],
}, },
], ],
}, },
], },
}, },
}; };

View File

@@ -1,8 +1,9 @@
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + local kp = (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-static-etcd.libsonnet') + { (import 'kube-prometheus/addons/static-etcd.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
etcd+:: { etcd+:: {
ips: ['127.0.0.1'], ips: ['127.0.0.1'],
clientCA: importstr 'etcd-client-ca.crt', clientCA: importstr 'etcd-client-ca.crt',

View File

@@ -1,7 +1,9 @@
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + local kp = (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-static-etcd.libsonnet') + { (import 'kube-prometheus/addons/static-etcd.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
// Reference info: https://github.com/coreos/kube-prometheus/blob/master/README.md#static-etcd-configuration // Reference info: https://github.com/coreos/kube-prometheus/blob/master/README.md#static-etcd-configuration
etcd+:: { etcd+:: {

View File

@@ -5,7 +5,7 @@ local prometheus = grafana.prometheus;
local template = grafana.template; local template = grafana.template;
local graphPanel = grafana.graphPanel; local graphPanel = grafana.graphPanel;
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
_config+:: { _config+:: {
namespace: 'monitoring', namespace: 'monitoring',
}, },

View File

@@ -1,4 +1,4 @@
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
_config+:: { _config+:: {
namespace: 'monitoring', namespace: 'monitoring',
}, },

View File

@@ -1,4 +1,4 @@
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
_config+:: { _config+:: {
namespace: 'monitoring', namespace: 'monitoring',
}, },

View File

@@ -14,10 +14,12 @@ local ingress(name, namespace, rules) = {
}; };
local kp = local kp =
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
{ {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
grafana+:: { grafana+:: {
config+: { config+: {
sections+: { sections+: {
@@ -47,7 +49,7 @@ local kp =
ingress+:: { ingress+:: {
'alertmanager-main': ingress( 'alertmanager-main': ingress(
'alertmanager-main', 'alertmanager-main',
$._config.namespace, $.values.common.namespace,
[{ [{
host: 'alertmanager.example.com', host: 'alertmanager.example.com',
http: { http: {
@@ -64,7 +66,7 @@ local kp =
), ),
grafana: ingress( grafana: ingress(
'grafana', 'grafana',
$._config.namespace, $.values.common.namespace,
[{ [{
host: 'grafana.example.com', host: 'grafana.example.com',
http: { http: {
@@ -81,7 +83,7 @@ local kp =
), ),
'prometheus-k8s': ingress( 'prometheus-k8s': ingress(
'prometheus-k8s', 'prometheus-k8s',
$._config.namespace, $.values.common.namespace,
[{ [{
host: 'prometheus.example.com', host: 'prometheus.example.com',
http: { http: {
@@ -105,7 +107,7 @@ local kp =
kind: 'Secret', kind: 'Secret',
metadata: { metadata: {
name: 'basic-auth', name: 'basic-auth',
namespace: $._config.namespace, namespace: $.values.common.namespace,
}, },
data: { auth: std.base64(importstr 'auth') }, data: { auth: std.base64(importstr 'auth') },
type: 'Opaque', type: 'Opaque',

View File

@@ -1,7 +1,9 @@
local mixin = import 'kube-prometheus/kube-prometheus-config-mixins.libsonnet'; local mixin = import 'kube-prometheus/addons/config-mixins.libsonnet';
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
}, },
} + mixin.withImageRepository('internal-registry.com/organization'); } + mixin.withImageRepository('internal-registry.com/organization');

View File

@@ -0,0 +1,2 @@
(import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/platforms/aws.libsonnet')

View File

@@ -1,2 +1,2 @@
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-bootkube.libsonnet') (import 'kube-prometheus/platforms/bootkube.libsonnet')

View File

@@ -1,3 +1,3 @@
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-kops.libsonnet') + (import 'kube-prometheus/platforms/kops.libsonnet') +
(import 'kube-prometheus/kube-prometheus-kops-coredns.libsonnet') (import 'kube-prometheus/platforms/kops-coredns.libsonnet')

View File

@@ -1,2 +1,2 @@
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-kops.libsonnet') (import 'kube-prometheus/platforms/kops.libsonnet')

View File

@@ -1,2 +0,0 @@
(import 'kube-prometheus/kube-prometheus.libsonnet') +
(import 'kube-prometheus/kube-prometheus-kube-aws.libsonnet')

View File

@@ -1,2 +1,2 @@
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-kubeadm.libsonnet') (import 'kube-prometheus/platforms/kubeadm.libsonnet')

View File

@@ -1,2 +1,2 @@
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-kubespray.libsonnet') (import 'kube-prometheus/platforms/kubespray.libsonnet')

View File

@@ -1,2 +1,2 @@
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-node-ports.libsonnet') (import 'kube-prometheus/addons/node-ports.libsonnet')

View File

@@ -1,4 +1,4 @@
((import 'kube-prometheus/kube-prometheus.libsonnet') + { ((import 'kube-prometheus/main.libsonnet') + {
nodeExporter+: { nodeExporter+: {
daemonset+: { daemonset+: {
metadata+: { metadata+: {

View File

@@ -1,5 +1,5 @@
local kp = local kp =
(import 'kube-prometheus/kube-prometheus.libsonnet') + { (import 'kube-prometheus/main.libsonnet') + {
values+:: { values+:: {
common+: { common+: {
namespace: 'monitoring', namespace: 'monitoring',

View File

@@ -1,11 +1,13 @@
local kp = local kp =
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-kubeadm.libsonnet') + (import 'kube-prometheus/platforms/kubeadm.libsonnet') +
// Note that NodePort type services is likely not a good idea for your production use case, it is only used for demonstration purposes here. // Note that NodePort type services is likely not a good idea for your production use case, it is only used for demonstration purposes here.
(import 'kube-prometheus/kube-prometheus-node-ports.libsonnet') + (import 'kube-prometheus/addons/node-ports.libsonnet') +
{ {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
alertmanager+:: { alertmanager+:: {
config: importstr 'alertmanager-config.yaml', config: importstr 'alertmanager-config.yaml',
}, },
@@ -22,7 +24,7 @@ local kp =
// For simplicity, each of the following values for 'externalUrl': // For simplicity, each of the following values for 'externalUrl':
// * assume that `minikube ip` prints "192.168.99.100" // * assume that `minikube ip` prints "192.168.99.100"
// * hard-code the NodePort for each app // * hard-code the NodePort for each app
prometheus+:: { prometheus+: {
prometheus+: { prometheus+: {
// Reference info: https://coreos.com/operators/prometheus/docs/latest/api.html#prometheusspec // Reference info: https://coreos.com/operators/prometheus/docs/latest/api.html#prometheusspec
spec+: { spec+: {

View File

@@ -1,25 +1,31 @@
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
}, },
prometheusAlerts+:: { prometheus+: {
groups+: [ prometheusRule+: {
{ spec+: {
name: 'example-group', groups+: [
rules: [
{ {
alert: 'Watchdog', name: 'example-group',
expr: 'vector(1)', rules: [
labels: { {
severity: 'none', alert: 'Watchdog',
}, expr: 'vector(1)',
annotations: { labels: {
description: 'This is a Watchdog meant to ensure that the entire alerting pipeline is functional.', severity: 'none',
}, },
annotations: {
description: 'This is a Watchdog meant to ensure that the entire alerting pipeline is functional.',
},
},
],
}, },
], ],
}, },
], },
}, },
}; };

View File

@@ -1,19 +1,25 @@
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
}, },
prometheusRules+:: { prometheus+: {
groups+: [ prometheusRule+: {
{ spec+: {
name: 'example-group', groups+: [
rules: [
{ {
record: 'some_recording_rule_name', name: 'example-group',
expr: 'vector(1)', rules: [
{
record: 'some_recording_rule_name',
expr: 'vector(1)',
},
],
}, },
], ],
}, },
], },
}, },
}; };

View File

@@ -1,9 +1,15 @@
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { local kp = (import 'kube-prometheus/main.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
}, },
prometheusAlerts+:: { prometheus+: {
groups+: (import 'existingrule.json').groups, prometheusRule+: {
spec+: {
groups+: (import 'existingrule.json').groups,
},
},
}, },
}; };

View File

@@ -1,4 +1,4 @@
((import 'kube-prometheus/kube-prometheus.libsonnet') + { ((import 'kube-prometheus/main.libsonnet') + {
prometheus+: { prometheus+: {
prometheus+: { prometheus+: {
metadata+: { metadata+: {

View File

@@ -1,14 +1,16 @@
local kp = local kp =
(import 'kube-prometheus/kube-prometheus.libsonnet') + (import 'kube-prometheus/main.libsonnet') +
// Uncomment the following imports to enable its patches // Uncomment the following imports to enable its patches
// (import 'kube-prometheus/kube-prometheus-anti-affinity.libsonnet') + // (import 'kube-prometheus/addons/anti-affinity.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-managed-cluster.libsonnet') + // (import 'kube-prometheus/addons/managed-cluster.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-node-ports.libsonnet') + // (import 'kube-prometheus/addons/node-ports.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-static-etcd.libsonnet') + // (import 'kube-prometheus/addons/static-etcd.libsonnet') +
// (import 'kube-prometheus/kube-prometheus-thanos-sidecar.libsonnet') + // (import 'kube-prometheus/addons/thanos-sidecar.libsonnet') +
{ {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
}, },
prometheus+:: { prometheus+:: {

View File

@@ -1,7 +1,9 @@
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + local kp = (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-strip-limits.libsonnet') + { (import 'kube-prometheus/addons/strip-limits.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
}, },
}; };

View File

@@ -1,23 +1,19 @@
{ {
_config+:: {
tolerations+:: [
{
key: 'key1',
operator: 'Equal',
value: 'value1',
effect: 'NoSchedule',
},
{
key: 'key2',
operator: 'Exists',
},
],
},
prometheus+: { prometheus+: {
prometheus+: { prometheus+: {
spec+: { spec+: {
tolerations: [t for t in $._config.tolerations], tolerations: [
{
key: 'key1',
operator: 'Equal',
value: 'value1',
effect: 'NoSchedule',
},
{
key: 'key2',
operator: 'Exists',
},
],
}, },
}, },
}, },

View File

@@ -1,33 +1,39 @@
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + local kp = (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/kube-prometheus-weave-net.libsonnet') + { (import 'kube-prometheus/addons/weave-net/weave-net.libsonnet') + {
_config+:: { values+:: {
namespace: 'monitoring', common+: {
namespace: 'monitoring',
},
}, },
prometheusAlerts+:: { prometheus+: {
groups: std.map( prometheusRuleWeaveNet+: {
function(group) spec+: {
if group.name == 'weave-net' then groups: std.map(
group { function(group)
rules: std.map( if group.name == 'weave-net' then
function(rule) group {
if rule.alert == 'WeaveNetFastDPFlowsLow' then rules: std.map(
rule { function(rule)
expr: 'sum(weave_flows) < 20000', if rule.alert == 'WeaveNetFastDPFlowsLow' then
} rule {
else if rule.alert == 'WeaveNetIPAMUnreachable' then expr: 'sum(weave_flows) < 20000',
rule { }
expr: 'weave_ipam_unreachable_percentage > 25', else if rule.alert == 'WeaveNetIPAMUnreachable' then
} rule {
else expr: 'weave_ipam_unreachable_percentage > 25',
rule }
, else
group.rules rule
), ,
} group.rules
else ),
group, }
super.groups else
), group,
super.groups
),
},
},
}, },
}; };

View File

@@ -25,14 +25,14 @@
alertmanager+:: { alertmanager+:: {
alertmanager+: { alertmanager+: {
spec+: spec+:
antiaffinity('alertmanager', [$._config.alertmanager.name], $._config.namespace), antiaffinity('alertmanager', [$.values.alertmanager.name], $.values.common.namespace),
}, },
}, },
prometheus+:: { prometheus+:: {
prometheus+: { prometheus+: {
spec+: spec+:
antiaffinity('prometheus', [$._config.prometheus.name], $._config.namespace), antiaffinity('prometheus', [$.values.prometheus.name], $.values.common.namespace),
}, },
}, },
} }

View File

@@ -1,4 +1,18 @@
local l = import 'lib/lib.libsonnet'; local imageName(image) =
local parts = std.split(image, '/');
local len = std.length(parts);
if len == 3 then
// registry.com/org/image
parts[2]
else if len == 2 then
// org/image
parts[1]
else if len == 1 then
// image, ie. busybox
parts[0]
else
error 'unknown image format: ' + image;
// withImageRepository is a mixin that replaces all images prefixes by repository. eg. // withImageRepository is a mixin that replaces all images prefixes by repository. eg.
// quay.io/coreos/addon-resizer -> $repository/addon-resizer // quay.io/coreos/addon-resizer -> $repository/addon-resizer
@@ -6,8 +20,8 @@ local l = import 'lib/lib.libsonnet';
local withImageRepository(repository) = { local withImageRepository(repository) = {
local oldRepos = super._config.imageRepos, local oldRepos = super._config.imageRepos,
local substituteRepository(image, repository) = local substituteRepository(image, repository) =
if repository == null then image else repository + '/' + l.imageName(image), if repository == null then image else repository + '/' + imageName(image),
_config+:: { values+:: {
imageRepos:: { imageRepos:: {
[field]: substituteRepository(oldRepos[field], repository) [field]: substituteRepository(oldRepos[field], repository)
for field in std.objectFields(oldRepos) for field in std.objectFields(oldRepos)

View File

@@ -2,9 +2,9 @@
// For more details on usage visit https://github.com/DirectXMan12/k8s-prometheus-adapter#quick-links // For more details on usage visit https://github.com/DirectXMan12/k8s-prometheus-adapter#quick-links
{ {
_config+:: { values+:: {
prometheusAdapter+:: { prometheusAdapter+: {
namespace: $._config.namespace, namespace: $.values.common.namespace,
// Rules for custom-metrics // Rules for custom-metrics
config+:: { config+:: {
rules+: [ rules+: [
@@ -78,7 +78,7 @@
}, },
}, },
prometheusAdapter+:: { prometheusAdapter+: {
customMetricsApiService: { customMetricsApiService: {
apiVersion: 'apiregistration.k8s.io/v1', apiVersion: 'apiregistration.k8s.io/v1',
kind: 'APIService', kind: 'APIService',
@@ -88,7 +88,7 @@
spec: { spec: {
service: { service: {
name: $.prometheusAdapter.service.metadata.name, name: $.prometheusAdapter.service.metadata.name,
namespace: $._config.prometheusAdapter.namespace, namespace: $.values.prometheusAdapter.namespace,
}, },
group: 'custom.metrics.k8s.io', group: 'custom.metrics.k8s.io',
version: 'v1beta1', version: 'v1beta1',
@@ -106,7 +106,7 @@
spec: { spec: {
service: { service: {
name: $.prometheusAdapter.service.metadata.name, name: $.prometheusAdapter.service.metadata.name,
namespace: $._config.prometheusAdapter.namespace, namespace: $.values.prometheusAdapter.namespace,
}, },
group: 'custom.metrics.k8s.io', group: 'custom.metrics.k8s.io',
version: 'v1beta2', version: 'v1beta2',
@@ -141,7 +141,7 @@
subjects: [{ subjects: [{
kind: 'ServiceAccount', kind: 'ServiceAccount',
name: $.prometheusAdapter.serviceAccount.metadata.name, name: $.prometheusAdapter.serviceAccount.metadata.name,
namespace: $._config.prometheusAdapter.namespace, namespace: $.values.prometheusAdapter.namespace,
}], }],
}, },
customMetricsClusterRoleBindingHPA: { customMetricsClusterRoleBindingHPA: {

View File

@@ -2,9 +2,9 @@
// For more details on usage visit https://github.com/DirectXMan12/k8s-prometheus-adapter#quick-links // For more details on usage visit https://github.com/DirectXMan12/k8s-prometheus-adapter#quick-links
{ {
_config+:: { values+:: {
prometheusAdapter+:: { prometheusAdapter+: {
namespace: $._config.namespace, namespace: $.values.common.namespace,
// Rules for external-metrics // Rules for external-metrics
config+:: { config+:: {
externalRules+: [ externalRules+: [
@@ -24,7 +24,7 @@
}, },
}, },
prometheusAdapter+:: { prometheusAdapter+: {
externalMetricsApiService: { externalMetricsApiService: {
apiVersion: 'apiregistration.k8s.io/v1', apiVersion: 'apiregistration.k8s.io/v1',
kind: 'APIService', kind: 'APIService',
@@ -34,7 +34,7 @@
spec: { spec: {
service: { service: {
name: $.prometheusAdapter.service.metadata.name, name: $.prometheusAdapter.service.metadata.name,
namespace: $._config.prometheusAdapter.namespace, namespace: $.values.prometheusAdapter.namespace,
}, },
group: 'external.metrics.k8s.io', group: 'external.metrics.k8s.io',
version: 'v1beta1', version: 'v1beta1',
@@ -70,7 +70,7 @@
subjects: [{ subjects: [{
kind: 'ServiceAccount', kind: 'ServiceAccount',
name: $.prometheusAdapter.serviceAccount.metadata.name, name: $.prometheusAdapter.serviceAccount.metadata.name,
namespace: $._config.prometheusAdapter.namespace, namespace: $.values.prometheusAdapter.namespace,
}], }],
}, },
externalMetricsClusterRoleBindingHPA: { externalMetricsClusterRoleBindingHPA: {

View File

@@ -1,5 +1,5 @@
{ {
prometheus+:: { prometheus+: {
serviceMonitorKubelet+: serviceMonitorKubelet+:
{ {
spec+: { spec+: {

View File

@@ -1,14 +1,15 @@
{ {
_config+:: { values+:: {
versions+:: { clusterVerticalAutoscaler: '0.8.1' }, clusterVerticalAutoscaler: {
imageRepos+:: { clusterVerticalAutoscaler: 'gcr.io/google_containers/cpvpa-amd64' }, version: '0.8.1',
image: 'gcr.io/google_containers/cpvpa-amd64:v0.8.1',
kubeStateMetrics+:: { baseCPU: '1m',
stepCPU: '1m', stepCPU: '1m',
baseMemory: '1Mi',
stepMemory: '2Mi', stepMemory: '2Mi',
}, },
}, },
ksmAutoscaler+:: { ksmAutoscaler+: {
clusterRole: { clusterRole: {
apiVersion: 'rbac.authorization.k8s.io/v1', apiVersion: 'rbac.authorization.k8s.io/v1',
kind: 'ClusterRole', kind: 'ClusterRole',
@@ -29,7 +30,7 @@
kind: 'ClusterRole', kind: 'ClusterRole',
name: 'ksm-autoscaler', name: 'ksm-autoscaler',
}, },
subjects: [{ kind: 'ServiceAccount', name: 'ksm-autoscaler', namespace: $._config.namespace }], subjects: [{ kind: 'ServiceAccount', name: 'ksm-autoscaler', namespace: $.values.common.namespace }],
}, },
roleBinding: { roleBinding: {
@@ -37,7 +38,7 @@
kind: 'RoleBinding', kind: 'RoleBinding',
metadata: { metadata: {
name: 'ksm-autoscaler', name: 'ksm-autoscaler',
namespace: $._config.namespace, namespace: $.values.common.namespace,
}, },
roleRef: { roleRef: {
apiGroup: 'rbac.authorization.k8s.io', apiGroup: 'rbac.authorization.k8s.io',
@@ -52,7 +53,7 @@
kind: 'Role', kind: 'Role',
metadata: { metadata: {
name: 'ksm-autoscaler', name: 'ksm-autoscaler',
namespace: $._config.namespace, namespace: $.values.common.namespace,
}, },
rules: [ rules: [
{ {
@@ -75,7 +76,7 @@
kind: 'ServiceAccount', kind: 'ServiceAccount',
metadata: { metadata: {
name: 'ksm-autoscaler', name: 'ksm-autoscaler',
namespace: $._config.namespace, namespace: $.values.common.namespace,
}, },
}, },
@@ -83,14 +84,21 @@
local podLabels = { app: 'ksm-autoscaler' }; local podLabels = { app: 'ksm-autoscaler' };
local c = { local c = {
name: 'ksm-autoscaler', name: 'ksm-autoscaler',
image: $._config.imageRepos.clusterVerticalAutoscaler + ':v' + $._config.versions.clusterVerticalAutoscaler, image: $.values.clusterVerticalAutoscaler.image,
args: [ args: [
'/cpvpa', '/cpvpa',
'--target=deployment/kube-state-metrics', '--target=deployment/kube-state-metrics',
'--namespace=' + $._config.namespace, '--namespace=' + $.values.common.namespace,
'--logtostderr=true', '--logtostderr=true',
'--poll-period-seconds=10', '--poll-period-seconds=10',
'--default-config={"kube-state-metrics":{"requests":{"cpu":{"base":"' + $._config.kubeStateMetrics.baseCPU + '","step":"' + $._config.kubeStateMetrics.stepCPU + '","nodesPerStep":1},"memory":{"base":"' + $._config.kubeStateMetrics.baseMemory + '","step":"' + $._config.kubeStateMetrics.stepMemory + '","nodesPerStep":1}},"limits":{"cpu":{"base":"' + $._config.kubeStateMetrics.baseCPU + '","step":"' + $._config.kubeStateMetrics.stepCPU + '","nodesPerStep":1},"memory":{"base":"' + $._config.kubeStateMetrics.baseMemory + '","step":"' + $._config.kubeStateMetrics.stepMemory + '","nodesPerStep":1}}}}', '--default-config={"kube-state-metrics":{"requests":{"cpu":{"base":"' + $.values.clusterVerticalAutoscaler.baseCPU +
'","step":"' + $.values.clusterVerticalAutoscaler.stepCPU +
'","nodesPerStep":1},"memory":{"base":"' + $.values.clusterVerticalAutoscaler.baseMemory +
'","step":"' + $.values.clusterVerticalAutoscaler.stepMemory +
'","nodesPerStep":1}},"limits":{"cpu":{"base":"' + $.values.clusterVerticalAutoscaler.baseCPU +
'","step":"' + $.values.clusterVerticalAutoscaler.stepCPU +
'","nodesPerStep":1},"memory":{"base":"' + $.values.clusterVerticalAutoscaler.baseMemory +
'","step":"' + $.values.clusterVerticalAutoscaler.stepMemory + '","nodesPerStep":1}}}}',
], ],
resources: { resources: {
requests: { cpu: '20m', memory: '10Mi' }, requests: { cpu: '20m', memory: '10Mi' },
@@ -102,7 +110,7 @@
kind: 'Deployment', kind: 'Deployment',
metadata: { metadata: {
name: 'ksm-autoscaler', name: 'ksm-autoscaler',
namespace: $._config.namespace, namespace: $.values.common.namespace,
labels: podLabels, labels: podLabels,
}, },
spec: { spec: {

View File

@@ -1,8 +1,8 @@
// On managed Kubernetes clusters some of the control plane components are not exposed to customers. // On managed Kubernetes clusters some of the control plane components are not exposed to customers.
// Disable scrape jobs, service monitors, and alert groups for these components by overwriting 'kube-prometheus.libsonnet' defaults // Disable scrape jobs, service monitors, and alert groups for these components by overwriting 'main.libsonnet' defaults
{ {
_config+:: { values+:: {
// This snippet walks the original object (super.jobs, set as temp var j) and creates a replacement jobs object // This snippet walks the original object (super.jobs, set as temp var j) and creates a replacement jobs object
// excluding any members of the set specified (eg: controller and scheduler). // excluding any members of the set specified (eg: controller and scheduler).
local j = super.jobs, local j = super.jobs,
@@ -13,7 +13,7 @@
}, },
// Skip alerting rules too // Skip alerting rules too
prometheus+:: { prometheus+: {
rules+:: { rules+:: {
local g = super.groups, local g = super.groups,
groups: [ groups: [

View File

@@ -1,5 +1,5 @@
(import 'github.com/etcd-io/etcd/Documentation/etcd-mixin/mixin.libsonnet') + { (import 'github.com/etcd-io/etcd/Documentation/etcd-mixin/mixin.libsonnet') + {
_config+:: { values+:: {
etcd: { etcd: {
ips: [], ips: [],
clientCA: null, clientCA: null,
@@ -9,7 +9,7 @@
insecureSkipVerify: null, insecureSkipVerify: null,
}, },
}, },
prometheus+:: { prometheus+: {
serviceEtcd: { serviceEtcd: {
apiVersion: 'v1', apiVersion: 'v1',
kind: 'Service', kind: 'Service',
@@ -36,7 +36,7 @@
subsets: [{ subsets: [{
addresses: [ addresses: [
{ ip: etcdIP } { ip: etcdIP }
for etcdIP in $._config.etcd.ips for etcdIP in $.values.etcd.ips
], ],
ports: [ ports: [
{ name: 'metrics', port: 2379, protocol: 'TCP' }, { name: 'metrics', port: 2379, protocol: 'TCP' },
@@ -65,8 +65,8 @@
caFile: '/etc/prometheus/secrets/kube-etcd-client-certs/etcd-client-ca.crt', caFile: '/etc/prometheus/secrets/kube-etcd-client-certs/etcd-client-ca.crt',
keyFile: '/etc/prometheus/secrets/kube-etcd-client-certs/etcd-client.key', keyFile: '/etc/prometheus/secrets/kube-etcd-client-certs/etcd-client.key',
certFile: '/etc/prometheus/secrets/kube-etcd-client-certs/etcd-client.crt', certFile: '/etc/prometheus/secrets/kube-etcd-client-certs/etcd-client.crt',
[if $._config.etcd.serverName != null then 'serverName']: $._config.etcd.serverName, [if $.values.etcd.serverName != null then 'serverName']: $.values.etcd.serverName,
[if $._config.etcd.insecureSkipVerify != null then 'insecureSkipVerify']: $._config.etcd.insecureSkipVerify, [if $.values.etcd.insecureSkipVerify != null then 'insecureSkipVerify']: $.values.etcd.insecureSkipVerify,
}, },
}, },
], ],
@@ -84,12 +84,12 @@
type: 'Opaque', type: 'Opaque',
metadata: { metadata: {
name: 'kube-etcd-client-certs', name: 'kube-etcd-client-certs',
namespace: $._config.namespace, namespace: $.values.common.namespace,
}, },
data: { data: {
'etcd-client-ca.crt': std.base64($._config.etcd.clientCA), 'etcd-client-ca.crt': std.base64($.values.etcd.clientCA),
'etcd-client.key': std.base64($._config.etcd.clientKey), 'etcd-client.key': std.base64($.values.etcd.clientKey),
'etcd-client.crt': std.base64($._config.etcd.clientCert), 'etcd-client.crt': std.base64($.values.etcd.clientCert),
}, },
}, },
prometheus+: { prometheus+: {

View File

@@ -0,0 +1,48 @@
// Strips spec.containers[].limits for certain containers
// https://github.com/prometheus-operator/kube-prometheus/issues/72
{
local noLimit(c) =
//if std.objectHas(c, 'resources') && c.name != 'kube-state-metrics'
if c.name != 'kube-state-metrics'
then c { resources+: { limits: {} } }
else c,
nodeExporter+: {
daemonset+: {
spec+: {
template+: {
spec+: {
containers: std.map(noLimit, super.containers),
},
},
},
},
},
kubeStateMetrics+: {
deployment+: {
spec+: {
template+: {
spec+: {
containers: std.map(noLimit, super.containers),
},
},
},
},
},
prometheusOperator+: {
deployment+: {
spec+: {
template+: {
spec+: {
local addArgs(c) =
if c.name == 'prometheus-operator'
then c { args+: ['--config-reloader-cpu=0'] }
else c,
containers: std.map(addArgs, super.containers),
},
},
},
},
},
}

View File

@@ -1,16 +1,16 @@
(import 'github.com/thanos-io/thanos/mixin/alerts/sidecar.libsonnet') + (import 'github.com/thanos-io/thanos/mixin/alerts/sidecar.libsonnet') +
{ {
_config+:: { values+:: {
versions+:: { thanos: 'v0.14.0' },
imageRepos+:: { thanos: 'quay.io/thanos/thanos' },
thanos+:: { thanos+:: {
version: '0.14.0',
image: 'quay.io/thanos/thanos:v0.14.0',
objectStorageConfig: { objectStorageConfig: {
key: 'thanos.yaml', // How the file inside the secret is called key: 'thanos.yaml', // How the file inside the secret is called
name: 'thanos-objectstorage', // This is the name of your Kubernetes secret with the config name: 'thanos-objectstorage', // This is the name of your Kubernetes secret with the config
}, },
}, },
}, },
prometheus+:: { prometheus+: {
local p = self, local p = self,
// Add the grpc port to the Prometheus service to be able to query it with the Thanos Querier // Add the grpc port to the Prometheus service to be able to query it with the Thanos Querier
@@ -26,9 +26,9 @@
apiVersion: 'v1', apiVersion: 'v1',
kind: 'Service', kind: 'Service',
metadata: { metadata: {
name: 'prometheus-' + p.name + '-thanos-sidecar', name: 'prometheus-' + p.config.name + '-thanos-sidecar',
namespace: p.namespace, namespace: p.config.namespace,
labels: { prometheus: p.name, app: 'thanos-sidecar' }, labels: { prometheus: p.config.name, app: 'thanos-sidecar' },
}, },
spec: { spec: {
ports: [ ports: [
@@ -42,9 +42,9 @@
prometheus+: { prometheus+: {
spec+: { spec+: {
thanos+: { thanos+: {
version: $._config.versions.thanos, version: $.values.thanos.version,
image: $._config.imageRepos.thanos + ':' + $._config.versions.thanos, image: $.values.thanos.image,
objectStorageConfig: $._config.thanos.objectStorageConfig, objectStorageConfig: $.values.thanos.objectStorageConfig,
}, },
}, },
}, },
@@ -54,7 +54,7 @@
kind: 'ServiceMonitor', kind: 'ServiceMonitor',
metadata: { metadata: {
name: 'thanos-sidecar', name: 'thanos-sidecar',
namespace: p.namespace, namespace: p.config.namespace,
labels: { labels: {
'app.kubernetes.io/name': 'prometheus', 'app.kubernetes.io/name': 'prometheus',
}, },
@@ -64,7 +64,7 @@
jobLabel: 'app', jobLabel: 'app',
selector: { selector: {
matchLabels: { matchLabels: {
prometheus: p.name, prometheus: p.config.name,
app: 'thanos-sidecar', app: 'thanos-sidecar',
}, },
}, },

View File

@@ -0,0 +1,134 @@
[
{
alert: 'WeaveNetIPAMSplitBrain',
expr: 'max(weave_ipam_unreachable_percentage) - min(weave_ipam_unreachable_percentage) > 0',
'for': '3m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'Percentage of all IP addresses owned by unreachable peers is not same for every node.',
description: 'actionable: Weave Net network has a split brain problem. Please find the problem and fix it.',
},
},
{
alert: 'WeaveNetIPAMUnreachable',
expr: 'weave_ipam_unreachable_percentage > 25',
'for': '10m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'Percentage of all IP addresses owned by unreachable peers is above threshold.',
description: 'actionable: Please find the problem and fix it.',
},
},
{
alert: 'WeaveNetIPAMPendingAllocates',
expr: 'sum(weave_ipam_pending_allocates) > 0',
'for': '3m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'Number of pending allocates is above the threshold.',
description: 'actionable: Please find the problem and fix it.',
},
},
{
alert: 'WeaveNetIPAMPendingClaims',
expr: 'sum(weave_ipam_pending_claims) > 0',
'for': '3m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'Number of pending claims is above the threshold.',
description: 'actionable: Please find the problem and fix it.',
},
},
{
alert: 'WeaveNetFastDPFlowsLow',
expr: 'sum(weave_flows) < 15000',
'for': '3m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'Number of FastDP flows is below the threshold.',
description: 'actionable: Please find the reason for FastDP flows to go below the threshold and fix it.',
},
},
{
alert: 'WeaveNetFastDPFlowsOff',
expr: 'sum(weave_flows == bool 0) > 0',
'for': '3m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'FastDP flows is zero.',
description: 'actionable: Please find the reason for FastDP flows to be off and fix it.',
},
},
{
alert: 'WeaveNetHighConnectionTerminationRate',
expr: 'rate(weave_connection_terminations_total[5m]) > 0.1',
'for': '5m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'A lot of connections are getting terminated.',
description: 'actionable: Please find the reason for the high connection termination rate and fix it.',
},
},
{
alert: 'WeaveNetConnectionsConnecting',
expr: 'sum(weave_connections{state="connecting"}) > 0',
'for': '3m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'A lot of connections are in connecting state.',
description: 'actionable: Please find the reason for this and fix it.',
},
},
{
alert: 'WeaveNetConnectionsRetying',
expr: 'sum(weave_connections{state="retrying"}) > 0',
'for': '3m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'A lot of connections are in retrying state.',
description: 'actionable: Please find the reason for this and fix it.',
},
},
{
alert: 'WeaveNetConnectionsPending',
expr: 'sum(weave_connections{state="pending"}) > 0',
'for': '3m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'A lot of connections are in pending state.',
description: 'actionable: Please find the reason for this and fix it.',
},
},
{
alert: 'WeaveNetConnectionsFailed',
expr: 'sum(weave_connections{state="failed"}) > 0',
'for': '3m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'A lot of connections are in failed state.',
description: 'actionable: Please find the reason and fix it.',
},
},
]

View File

@@ -0,0 +1,73 @@
{
prometheus+: {
local p = self,
serviceWeaveNet: {
apiVersion: 'v1',
kind: 'Service',
metadata: {
name: 'weave-net',
namespace: 'kube-system',
labels: { 'app.kubernetes.io/name': 'weave-net' },
},
spec: {
ports: [
{ name: 'weave-net-metrics', targetPort: 6782, port: 6782 },
],
selector: { name: 'weave-net' },
clusterIP: 'None',
},
},
serviceMonitorWeaveNet: {
apiVersion: 'monitoring.coreos.com/v1',
kind: 'ServiceMonitor',
metadata: {
name: 'weave-net',
labels: {
'app.kubernetes.io/name': 'weave-net',
},
namespace: 'monitoring',
},
spec: {
jobLabel: 'app.kubernetes.io/name',
endpoints: [
{
port: 'weave-net-metrics',
path: '/metrics',
interval: '15s',
},
],
namespaceSelector: {
matchNames: [
'kube-system',
],
},
selector: {
matchLabels: {
'app.kubernetes.io/name': 'weave-net',
},
},
},
},
prometheusRuleWeaveNet: {
apiVersion: 'monitoring.coreos.com/v1',
kind: 'PrometheusRule',
metadata: {
labels: p.config.mixin.ruleLabels,
name: 'weave-net-rules',
namespace: p.config.namespace,
},
spec: {
groups: [{
name: 'weave-net',
rules: (import './alerts.libsonnet'),
}],
},
},
mixin+:: {
grafanaDashboards+:: {
'weave-net.json': (import './grafana-weave-net.json'),
'weave-net-cluster.json': (import './grafana-weave-net-cluster.json'),
},
},
},
}

View File

@@ -1,4 +1,4 @@
local krp = import '../kube-rbac-proxy/container.libsonnet'; local krp = import './kube-rbac-proxy.libsonnet';
local defaults = { local defaults = {
local defaults = self, local defaults = self,

View File

@@ -1,4 +1,4 @@
local krp = (import '../kube-rbac-proxy/container.libsonnet'); local krp = import './kube-rbac-proxy.libsonnet';
local defaults = { local defaults = {
local defaults = self, local defaults = self,

View File

@@ -1,4 +1,4 @@
local krp = (import '../kube-rbac-proxy/container.libsonnet'); local krp = import './kube-rbac-proxy.libsonnet';
local defaults = { local defaults = {
local defaults = self, local defaults = self,

View File

@@ -1,4 +1,4 @@
local krp = (import '../kube-rbac-proxy/container.libsonnet'); local krp = import './kube-rbac-proxy.libsonnet';
local prometheusOperator = import 'github.com/prometheus-operator/prometheus-operator/jsonnet/prometheus-operator/prometheus-operator.libsonnet'; local prometheusOperator = import 'github.com/prometheus-operator/prometheus-operator/jsonnet/prometheus-operator/prometheus-operator.libsonnet';
local defaults = { local defaults = {

View File

@@ -1,4 +1,4 @@
local relabelings = import 'kube-prometheus/dropping-deprecated-metrics-relabelings.libsonnet'; local relabelings = import '../addons/dropping-deprecated-metrics-relabelings.libsonnet';
local defaults = { local defaults = {
local defaults = self, local defaults = self,

View File

@@ -1,8 +0,0 @@
local kp = (import './kube-prometheus/kube-prometheus.libsonnet');
{ ['0prometheus-operator-' + name]: kp.prometheusOperator[name] for name in std.objectFields(kp.prometheusOperator) } +
{ ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } +
{ ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } +
{ ['alertmanager-' + name]: kp.alertmanager[name] for name in std.objectFields(kp.alertmanager) } +
{ ['prometheus-' + name]: kp.prometheus[name] for name in std.objectFields(kp.prometheus) } +
{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) }

View File

@@ -1,35 +0,0 @@
// Strips spec.containers[].limits for certain containers
// https://github.com/prometheus-operator/kube-prometheus/issues/72
{
_config+:: {
resources+:: {
'addon-resizer'+: {
limits: {},
},
'kube-rbac-proxy'+: {
limits: {},
},
'kube-state-metrics'+: {
limits: {},
},
'node-exporter'+: {
limits: {},
},
},
},
prometheusOperator+: {
deployment+: {
spec+: {
template+: {
spec+: {
local addArgs(c) =
if c.name == 'prometheus-operator'
then c { args+: ['--config-reloader-cpu=0'] }
else c,
containers: std.map(addArgs, super.containers),
},
},
},
},
},
}

View File

@@ -1,196 +0,0 @@
{
prometheus+: {
serviceWeaveNet: {
apiVersion: 'v1',
kind: 'Service',
metadata: {
name: 'weave-net',
namespace: 'kube-system',
labels: { 'app.kubernetes.io/name': 'weave-net' },
},
spec: {
ports: [
{ name: 'weave-net-metrics', targetPort: 6782, port: 6782 },
],
selector: { name: 'weave-net' },
clusterIP: 'None',
},
},
serviceMonitorWeaveNet: {
apiVersion: 'monitoring.coreos.com/v1',
kind: 'ServiceMonitor',
metadata: {
name: 'weave-net',
labels: {
'app.kubernetes.io/name': 'weave-net',
},
namespace: 'monitoring',
},
spec: {
jobLabel: 'app.kubernetes.io/name',
endpoints: [
{
port: 'weave-net-metrics',
path: '/metrics',
interval: '15s',
},
],
namespaceSelector: {
matchNames: [
'kube-system',
],
},
selector: {
matchLabels: {
'app.kubernetes.io/name': 'weave-net',
},
},
},
},
},
prometheusRules+: {
groups+: [
{
name: 'weave-net',
rules: [
{
alert: 'WeaveNetIPAMSplitBrain',
expr: 'max(weave_ipam_unreachable_percentage) - min(weave_ipam_unreachable_percentage) > 0',
'for': '3m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'Percentage of all IP addresses owned by unreachable peers is not same for every node.',
description: 'actionable: Weave Net network has a split brain problem. Please find the problem and fix it.',
},
},
{
alert: 'WeaveNetIPAMUnreachable',
expr: 'weave_ipam_unreachable_percentage > 25',
'for': '10m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'Percentage of all IP addresses owned by unreachable peers is above threshold.',
description: 'actionable: Please find the problem and fix it.',
},
},
{
alert: 'WeaveNetIPAMPendingAllocates',
expr: 'sum(weave_ipam_pending_allocates) > 0',
'for': '3m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'Number of pending allocates is above the threshold.',
description: 'actionable: Please find the problem and fix it.',
},
},
{
alert: 'WeaveNetIPAMPendingClaims',
expr: 'sum(weave_ipam_pending_claims) > 0',
'for': '3m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'Number of pending claims is above the threshold.',
description: 'actionable: Please find the problem and fix it.',
},
},
{
alert: 'WeaveNetFastDPFlowsLow',
expr: 'sum(weave_flows) < 15000',
'for': '3m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'Number of FastDP flows is below the threshold.',
description: 'actionable: Please find the reason for FastDP flows to go below the threshold and fix it.',
},
},
{
alert: 'WeaveNetFastDPFlowsOff',
expr: 'sum(weave_flows == bool 0) > 0',
'for': '3m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'FastDP flows is zero.',
description: 'actionable: Please find the reason for FastDP flows to be off and fix it.',
},
},
{
alert: 'WeaveNetHighConnectionTerminationRate',
expr: 'rate(weave_connection_terminations_total[5m]) > 0.1',
'for': '5m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'A lot of connections are getting terminated.',
description: 'actionable: Please find the reason for the high connection termination rate and fix it.',
},
},
{
alert: 'WeaveNetConnectionsConnecting',
expr: 'sum(weave_connections{state="connecting"}) > 0',
'for': '3m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'A lot of connections are in connecting state.',
description: 'actionable: Please find the reason for this and fix it.',
},
},
{
alert: 'WeaveNetConnectionsRetying',
expr: 'sum(weave_connections{state="retrying"}) > 0',
'for': '3m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'A lot of connections are in retrying state.',
description: 'actionable: Please find the reason for this and fix it.',
},
},
{
alert: 'WeaveNetConnectionsPending',
expr: 'sum(weave_connections{state="pending"}) > 0',
'for': '3m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'A lot of connections are in pending state.',
description: 'actionable: Please find the reason for this and fix it.',
},
},
{
alert: 'WeaveNetConnectionsFailed',
expr: 'sum(weave_connections{state="failed"}) > 0',
'for': '3m',
labels: {
severity: 'critical',
},
annotations: {
summary: 'A lot of connections are in failed state.',
description: 'actionable: Please find the reason and fix it.',
},
},
],
},
],
},
grafanaDashboards+:: {
'weave-net.json': (import './grafana-weave-net.json'),
'weave-net-cluster.json': (import './grafana-weave-net-cluster.json'),
},
}

View File

@@ -1,21 +0,0 @@
// imageName extracts the image name from a fully qualified image string. eg.
// quay.io/coreos/addon-resizer -> addon-resizer
// grafana/grafana -> grafana
local imageName(image) =
local parts = std.split(image, '/');
local len = std.length(parts);
if len == 3 then
// registry.com/org/image
parts[2]
else if len == 2 then
// org/image
parts[1]
else if len == 1 then
// image, ie. busybox
parts[0]
else
error 'unknown image format: ' + image;
{
imageName:: imageName,
}

View File

@@ -1 +0,0 @@
(import 'image.libsonnet')

View File

@@ -1,13 +1,13 @@
local alertmanager = import './alertmanager/alertmanager.libsonnet'; local alertmanager = import './components/alertmanager.libsonnet';
local blackboxExporter = import './blackbox-exporter/blackbox-exporter.libsonnet'; local blackboxExporter = import './components/blackbox-exporter.libsonnet';
local grafana = import './grafana/grafana.libsonnet'; local grafana = import './components/grafana.libsonnet';
local kubeStateMetrics = import './kube-state-metrics/kube-state-metrics.libsonnet'; local kubeStateMetrics = import './components/kube-state-metrics.libsonnet';
local customMixin = import './mixin/custom.libsonnet'; local customMixin = import './components/mixin/custom.libsonnet';
local kubernetesMixin = import './mixin/kubernetes.libsonnet'; local kubernetesMixin = import './components/mixin/kubernetes.libsonnet';
local nodeExporter = import './node-exporter/node-exporter.libsonnet'; local nodeExporter = import './components/node-exporter.libsonnet';
local prometheusAdapter = import './prometheus-adapter/prometheus-adapter.libsonnet'; local prometheusAdapter = import './components/prometheus-adapter.libsonnet';
local prometheusOperator = import './prometheus-operator/prometheus-operator.libsonnet'; local prometheusOperator = import './components/prometheus-operator.libsonnet';
local prometheus = import './prometheus/prometheus.libsonnet'; local prometheus = import './components/prometheus.libsonnet';
{ {
// using `values` as this is similar to helm // using `values` as this is similar to helm

View File

@@ -1,5 +1,5 @@
{ {
_config+:: { values+:: {
eks: { eks: {
minimumAvailableIPs: 10, minimumAvailableIPs: 10,
minimumAvailableIPsTime: '10m', minimumAvailableIPsTime: '10m',
@@ -39,7 +39,7 @@
kind: 'ServiceMonitor', kind: 'ServiceMonitor',
metadata: { metadata: {
name: 'awsekscni', name: 'awsekscni',
namespace: $._config.namespace, namespace: $.values.common.namespace,
labels: { labels: {
'app.kubernetes.io/name': 'eks-cni', 'app.kubernetes.io/name': 'eks-cni',
}, },
@@ -65,25 +65,34 @@
], ],
}, },
}, },
}, prometheusRuleEksCNI: {
prometheusRules+: { apiVersion: 'monitoring.coreos.com/v1',
groups+: [ kind: 'PrometheusRule',
{ metadata: {
name: 'kube-prometheus-eks.rules', labels: $.prometheus.config.commonLabels + $.prometheus.config.mixin.ruleLabels,
rules: [ name: 'eks-rules',
namespace: $.prometheus.config.namespace,
},
spec: {
groups: [
{ {
expr: 'sum by(instance) (awscni_ip_max) - sum by(instance) (awscni_assigned_ip_addresses) < %s' % $._config.eks.minimumAvailableIPs, name: 'kube-prometheus-eks.rules',
labels: { rules: [
severity: 'critical', {
}, expr: 'sum by(instance) (awscni_ip_max) - sum by(instance) (awscni_assigned_ip_addresses) < %s' % $.values.eks.minimumAvailableIPs,
annotations: { labels: {
message: 'Instance {{ $labels.instance }} has less than 10 IPs available.', severity: 'critical',
}, },
'for': $._config.eks.minimumAvailableIPsTime, annotations: {
alert: 'EksAvailableIPs', message: 'Instance {{ $labels.instance }} has less than 10 IPs available.',
},
'for': $.values.eks.minimumAvailableIPsTime,
alert: 'EksAvailableIPs',
},
],
}, },
], ],
}, },
], },
}, },
} }

View File

@@ -1,4 +1,4 @@
(import './kube-prometheus-managed-cluster.libsonnet') + { (import '../addons/managed-cluster.libsonnet') + {
_config+:: { _config+:: {
prometheusAdapter+:: { prometheusAdapter+:: {
config+: { config+: {