Merge pull request #875 from paulfantom/directory-layout
Simplify directory structure
This commit is contained in:
111
README.md
111
README.md
@@ -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,11 +483,13 @@ 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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
},
|
},
|
||||||
|
},
|
||||||
} + mixin.withImageRepository('internal-registry.com/organization');
|
} + mixin.withImageRepository('internal-registry.com/organization');
|
||||||
|
|
||||||
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
||||||
@@ -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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
|
},
|
||||||
prometheus+:: {
|
prometheus+: {
|
||||||
namespaces: [],
|
namespaces: [],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -718,11 +725,13 @@ 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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
},
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
||||||
|
|||||||
@@ -7,12 +7,16 @@ 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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
},
|
},
|
||||||
prometheusRules+:: {
|
},
|
||||||
|
prometheus+: {
|
||||||
|
prometheusRuleEksCNI+: {
|
||||||
|
spec+: {
|
||||||
groups+: [
|
groups+: [
|
||||||
{
|
{
|
||||||
name: 'example-group',
|
name: 'example-group',
|
||||||
@@ -25,6 +29,8 @@ local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') +
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
||||||
|
|||||||
@@ -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,11 +59,15 @@ 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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
},
|
},
|
||||||
prometheusAlerts+:: {
|
},
|
||||||
|
prometheus+: {
|
||||||
|
prometheusRule+: {
|
||||||
|
spec+: {
|
||||||
groups+: [
|
groups+: [
|
||||||
{
|
{
|
||||||
name: 'example-group',
|
name: 'example-group',
|
||||||
@@ -82,6 +86,8 @@ local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
||||||
@@ -102,11 +108,15 @@ 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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
},
|
},
|
||||||
prometheusRules+:: {
|
},
|
||||||
|
prometheus+: {
|
||||||
|
prometheusRule+: {
|
||||||
|
spec+: {
|
||||||
groups+: [
|
groups+: [
|
||||||
{
|
{
|
||||||
name: 'example-group',
|
name: 'example-group',
|
||||||
@@ -119,6 +129,8 @@ local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
||||||
@@ -149,13 +161,19 @@ 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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
},
|
},
|
||||||
prometheusAlerts+:: {
|
},
|
||||||
|
prometheus+: {
|
||||||
|
prometheusRule+: {
|
||||||
|
spec+: {
|
||||||
groups+: (import 'existingrule.json').groups,
|
groups+: (import 'existingrule.json').groups,
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
||||||
@@ -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',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -17,12 +17,16 @@ 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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
},
|
},
|
||||||
prometheusAlerts+:: {
|
},
|
||||||
|
prometheus+: {
|
||||||
|
prometheusRuleWeaveNet+: {
|
||||||
|
spec+: {
|
||||||
groups: std.map(
|
groups: std.map(
|
||||||
function(group)
|
function(group)
|
||||||
if group.name == 'weave-net' then
|
if group.name == 'weave-net' then
|
||||||
@@ -48,6 +52,8 @@ local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') +
|
|||||||
super.groups
|
super.groups
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
||||||
|
|||||||
@@ -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) }
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + {
|
local kp = (import 'kube-prometheus/main.libsonnet') + {
|
||||||
_config+:: {
|
values+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
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',
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + {
|
local kp = (import 'kube-prometheus/main.libsonnet') + {
|
||||||
_config+:: {
|
values+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
|
},
|
||||||
|
|
||||||
prometheus+:: {
|
prometheus+:: {
|
||||||
namespaces+: ['my-namespace', 'my-second-namespace'],
|
namespaces+: ['my-namespace', 'my-second-namespace'],
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
((import 'kube-prometheus/kube-prometheus.libsonnet') + {
|
((import 'kube-prometheus/main.libsonnet') + {
|
||||||
_config+:: {
|
values+:: {
|
||||||
alertmanager+: {
|
alertmanager+: {
|
||||||
config: |||
|
config: |||
|
||||||
global:
|
global:
|
||||||
|
|||||||
@@ -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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
|
},
|
||||||
prometheus+:: {
|
prometheus+: {
|
||||||
namespaces: [],
|
namespaces: [],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + {
|
local kp = (import 'kube-prometheus/main.libsonnet') + {
|
||||||
|
values+:: {
|
||||||
_config+:: {
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
},
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
[kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus)] +
|
[kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus)] +
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
},
|
},
|
||||||
prometheusRules+:: {
|
},
|
||||||
|
prometheus+: {
|
||||||
|
prometheusRuleEksCNI+: {
|
||||||
|
spec+: {
|
||||||
groups+: [
|
groups+: [
|
||||||
{
|
{
|
||||||
name: 'example-group',
|
name: 'example-group',
|
||||||
@@ -16,6 +20,8 @@ local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') +
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
||||||
|
|||||||
@@ -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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
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',
|
||||||
|
|||||||
@@ -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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
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+:: {
|
||||||
|
|||||||
@@ -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',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
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',
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
},
|
},
|
||||||
|
},
|
||||||
} + mixin.withImageRepository('internal-registry.com/organization');
|
} + mixin.withImageRepository('internal-registry.com/organization');
|
||||||
|
|
||||||
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
||||||
|
|||||||
2
examples/jsonnet-snippets/aws.jsonnet
Normal file
2
examples/jsonnet-snippets/aws.jsonnet
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
(import 'kube-prometheus/main.libsonnet') +
|
||||||
|
(import 'kube-prometheus/platforms/aws.libsonnet')
|
||||||
@@ -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')
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
(import 'kube-prometheus/kube-prometheus.libsonnet') +
|
|
||||||
(import 'kube-prometheus/kube-prometheus-kube-aws.libsonnet')
|
|
||||||
@@ -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')
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
((import 'kube-prometheus/kube-prometheus.libsonnet') + {
|
((import 'kube-prometheus/main.libsonnet') + {
|
||||||
nodeExporter+: {
|
nodeExporter+: {
|
||||||
daemonset+: {
|
daemonset+: {
|
||||||
metadata+: {
|
metadata+: {
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
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+: {
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + {
|
local kp = (import 'kube-prometheus/main.libsonnet') + {
|
||||||
_config+:: {
|
values+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
},
|
},
|
||||||
prometheusAlerts+:: {
|
},
|
||||||
|
prometheus+: {
|
||||||
|
prometheusRule+: {
|
||||||
|
spec+: {
|
||||||
groups+: [
|
groups+: [
|
||||||
{
|
{
|
||||||
name: 'example-group',
|
name: 'example-group',
|
||||||
@@ -21,6 +25,8 @@ local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + {
|
local kp = (import 'kube-prometheus/main.libsonnet') + {
|
||||||
_config+:: {
|
values+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
},
|
},
|
||||||
prometheusRules+:: {
|
},
|
||||||
|
prometheus+: {
|
||||||
|
prometheusRule+: {
|
||||||
|
spec+: {
|
||||||
groups+: [
|
groups+: [
|
||||||
{
|
{
|
||||||
name: 'example-group',
|
name: 'example-group',
|
||||||
@@ -15,6 +19,8 @@ local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
||||||
|
|||||||
@@ -1,10 +1,16 @@
|
|||||||
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + {
|
local kp = (import 'kube-prometheus/main.libsonnet') + {
|
||||||
_config+:: {
|
values+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
},
|
},
|
||||||
prometheusAlerts+:: {
|
},
|
||||||
|
prometheus+: {
|
||||||
|
prometheusRule+: {
|
||||||
|
spec+: {
|
||||||
groups+: (import 'existingrule.json').groups,
|
groups+: (import 'existingrule.json').groups,
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
((import 'kube-prometheus/kube-prometheus.libsonnet') + {
|
((import 'kube-prometheus/main.libsonnet') + {
|
||||||
prometheus+: {
|
prometheus+: {
|
||||||
prometheus+: {
|
prometheus+: {
|
||||||
metadata+: {
|
metadata+: {
|
||||||
|
|||||||
@@ -1,15 +1,17 @@
|
|||||||
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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
|
||||||
prometheus+:: {
|
prometheus+:: {
|
||||||
prometheus+: {
|
prometheus+: {
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
},
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
{
|
{
|
||||||
_config+:: {
|
prometheus+: {
|
||||||
tolerations+:: [
|
prometheus+: {
|
||||||
|
spec+: {
|
||||||
|
tolerations: [
|
||||||
{
|
{
|
||||||
key: 'key1',
|
key: 'key1',
|
||||||
operator: 'Equal',
|
operator: 'Equal',
|
||||||
@@ -13,12 +15,6 @@
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
prometheus+: {
|
|
||||||
prometheus+: {
|
|
||||||
spec+: {
|
|
||||||
tolerations: [t for t in $._config.tolerations],
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
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+:: {
|
||||||
|
common+: {
|
||||||
namespace: 'monitoring',
|
namespace: 'monitoring',
|
||||||
},
|
},
|
||||||
prometheusAlerts+:: {
|
},
|
||||||
|
prometheus+: {
|
||||||
|
prometheusRuleWeaveNet+: {
|
||||||
|
spec+: {
|
||||||
groups: std.map(
|
groups: std.map(
|
||||||
function(group)
|
function(group)
|
||||||
if group.name == 'weave-net' then
|
if group.name == 'weave-net' then
|
||||||
@@ -29,6 +33,8 @@ local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') +
|
|||||||
super.groups
|
super.groups
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
|
||||||
|
|||||||
@@ -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),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -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)
|
||||||
@@ -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: {
|
||||||
@@ -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: {
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
prometheus+:: {
|
prometheus+: {
|
||||||
serviceMonitorKubelet+:
|
serviceMonitorKubelet+:
|
||||||
{
|
{
|
||||||
spec+: {
|
spec+: {
|
||||||
@@ -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: {
|
||||||
@@ -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: [
|
||||||
@@ -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+: {
|
||||||
48
jsonnet/kube-prometheus/addons/strip-limits.libsonnet
Normal file
48
jsonnet/kube-prometheus/addons/strip-limits.libsonnet
Normal 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),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -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',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
134
jsonnet/kube-prometheus/addons/weave-net/alerts.libsonnet
Normal file
134
jsonnet/kube-prometheus/addons/weave-net/alerts.libsonnet
Normal 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.',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
73
jsonnet/kube-prometheus/addons/weave-net/weave-net.libsonnet
Normal file
73
jsonnet/kube-prometheus/addons/weave-net/weave-net.libsonnet
Normal 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'),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -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,
|
||||||
@@ -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,
|
||||||
@@ -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,
|
||||||
@@ -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 = {
|
||||||
@@ -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,
|
||||||
@@ -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) }
|
|
||||||
@@ -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),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -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'),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -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,
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
(import 'image.libsonnet')
|
|
||||||
@@ -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
|
||||||
@@ -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: {
|
||||||
|
apiVersion: 'monitoring.coreos.com/v1',
|
||||||
|
kind: 'PrometheusRule',
|
||||||
|
metadata: {
|
||||||
|
labels: $.prometheus.config.commonLabels + $.prometheus.config.mixin.ruleLabels,
|
||||||
|
name: 'eks-rules',
|
||||||
|
namespace: $.prometheus.config.namespace,
|
||||||
},
|
},
|
||||||
prometheusRules+: {
|
spec: {
|
||||||
groups+: [
|
groups: [
|
||||||
{
|
{
|
||||||
name: 'kube-prometheus-eks.rules',
|
name: 'kube-prometheus-eks.rules',
|
||||||
rules: [
|
rules: [
|
||||||
{
|
{
|
||||||
expr: 'sum by(instance) (awscni_ip_max) - sum by(instance) (awscni_assigned_ip_addresses) < %s' % $._config.eks.minimumAvailableIPs,
|
expr: 'sum by(instance) (awscni_ip_max) - sum by(instance) (awscni_assigned_ip_addresses) < %s' % $.values.eks.minimumAvailableIPs,
|
||||||
labels: {
|
labels: {
|
||||||
severity: 'critical',
|
severity: 'critical',
|
||||||
},
|
},
|
||||||
annotations: {
|
annotations: {
|
||||||
message: 'Instance {{ $labels.instance }} has less than 10 IPs available.',
|
message: 'Instance {{ $labels.instance }} has less than 10 IPs available.',
|
||||||
},
|
},
|
||||||
'for': $._config.eks.minimumAvailableIPsTime,
|
'for': $.values.eks.minimumAvailableIPsTime,
|
||||||
alert: 'EksAvailableIPs',
|
alert: 'EksAvailableIPs',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
(import './kube-prometheus-managed-cluster.libsonnet') + {
|
(import '../addons/managed-cluster.libsonnet') + {
|
||||||
_config+:: {
|
_config+:: {
|
||||||
prometheusAdapter+:: {
|
prometheusAdapter+:: {
|
||||||
config+: {
|
config+: {
|
||||||
Reference in New Issue
Block a user