From ffe2bcf31532a4dbe8fbdb2e6ebd22e6afa1d2ff Mon Sep 17 00:00:00 2001 From: Maxime Brunet Date: Fri, 19 Feb 2021 15:57:03 -0800 Subject: [PATCH] sidecar: Add pod discovery Signed-off-by: Maxime Brunet --- CHANGELOG.md | 1 + all.jsonnet | 18 ++-- .../manifests/thanos-query-deployment.yaml | 1 + .../all/manifests/thanos-sidecar-service.yaml | 21 +++++ .../thanos-sidecar-serviceMonitor.yaml | 24 ++++++ .../kube-thanos/kube-thanos-sidecar.libsonnet | 82 +++++++++++++++++++ jsonnet/kube-thanos/thanos.libsonnet | 1 + 7 files changed, 143 insertions(+), 5 deletions(-) create mode 100644 examples/all/manifests/thanos-sidecar-service.yaml create mode 100644 examples/all/manifests/thanos-sidecar-serviceMonitor.yaml create mode 100644 jsonnet/kube-thanos/kube-thanos-sidecar.libsonnet diff --git a/CHANGELOG.md b/CHANGELOG.md index 89b85f8..9f0680e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ We use *breaking* word for marking changes that are not backward compatible (rel ### Added +- [#192](https://github.com/thanos-io/kube-thanos/pull/192) sidecar: Add pod discovery - [#194](https://github.com/thanos-io/kube-thanos/pull/194) Allow configuring --label and --receive.tenant-label-name flags. ### Fixed diff --git a/all.jsonnet b/all.jsonnet index b85cd06..5283f19 100644 --- a/all.jsonnet +++ b/all.jsonnet @@ -70,6 +70,17 @@ local ru = t.rule(commonConfig { serviceMonitor: true, }); +local sc = t.sidecar(commonConfig { + // namespace: 'monitoring', + serviceMonitor: true, + // Labels of the Prometheus pods with a Thanos Sidecar container + podLabelSelector: { + // Here it is the default label given by the prometheus-operator + // to all Prometheus pods + app: 'prometheus', + }, +}); + local s = t.store(commonConfig { replicas: 1, serviceMonitor: true, @@ -96,10 +107,6 @@ local s = t.store(commonConfig { local q = t.query(commonConfig { name: 'thanos-query', replicas: 1, - stores: [ - 'dnssrv+_grpc._tcp.%s.%s.svc.cluster.local' % [service.metadata.name, service.metadata.namespace] - for service in [re.service, ru.service, s.service] - ], externalPrefix: '', resources: {}, queryTimeout: '5m', @@ -191,7 +198,7 @@ local strs = t.storeShards(commonConfig { local finalQ = t.query(q.config { stores: [ 'dnssrv+_grpc._tcp.%s.%s.svc.cluster.local' % [service.metadata.name, service.metadata.namespace] - for service in [re.service, ru.service, s.service] + + for service in [re.service, ru.service, sc.service, s.service] + [rcvs.hashrings[hashring].service for hashring in std.objectFields(rcvs.hashrings)] + [strs.shards[shard].service for shard in std.objectFields(strs.shards)] ], @@ -201,6 +208,7 @@ local finalQ = t.query(q.config { { ['thanos-compact-' + name]: c[name] for name in std.objectFields(c) if c[name] != null } + { ['thanos-receive-' + name]: re[name] for name in std.objectFields(re) if re[name] != null } + { ['thanos-rule-' + name]: finalRu[name] for name in std.objectFields(finalRu) if finalRu[name] != null } + +{ ['thanos-sidecar-' + name]: sc[name] for name in std.objectFields(sc) if sc[name] != null } + { ['thanos-store-' + name]: s[name] for name in std.objectFields(s) if s[name] != null } + { ['thanos-query-' + name]: finalQ[name] for name in std.objectFields(finalQ) if finalQ[name] != null } + { ['thanos-query-frontend-' + name]: qf[name] for name in std.objectFields(qf) if qf[name] != null } + diff --git a/examples/all/manifests/thanos-query-deployment.yaml b/examples/all/manifests/thanos-query-deployment.yaml index 6e67afa..8d6c67b 100644 --- a/examples/all/manifests/thanos-query-deployment.yaml +++ b/examples/all/manifests/thanos-query-deployment.yaml @@ -48,6 +48,7 @@ spec: - --query.replica-label=rule_replica - --store=dnssrv+_grpc._tcp.thanos-receive.thanos.svc.cluster.local - --store=dnssrv+_grpc._tcp.thanos-rule.thanos.svc.cluster.local + - --store=dnssrv+_grpc._tcp.thanos-sidecar.thanos.svc.cluster.local - --store=dnssrv+_grpc._tcp.thanos-store.thanos.svc.cluster.local - --store=dnssrv+_grpc._tcp.thanos-receive-default.thanos.svc.cluster.local - --store=dnssrv+_grpc._tcp.thanos-receive-region-1.thanos.svc.cluster.local diff --git a/examples/all/manifests/thanos-sidecar-service.yaml b/examples/all/manifests/thanos-sidecar-service.yaml new file mode 100644 index 0000000..98e9794 --- /dev/null +++ b/examples/all/manifests/thanos-sidecar-service.yaml @@ -0,0 +1,21 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: prometheus-sidecar + app.kubernetes.io/instance: thanos-sidecar + app.kubernetes.io/name: thanos-sidecar + app.kubernetes.io/version: v0.17.2 + name: thanos-sidecar + namespace: thanos +spec: + clusterIP: None + ports: + - name: grpc + port: 10901 + targetPort: 10901 + - name: http + port: 10902 + targetPort: 10902 + selector: + app: prometheus diff --git a/examples/all/manifests/thanos-sidecar-serviceMonitor.yaml b/examples/all/manifests/thanos-sidecar-serviceMonitor.yaml new file mode 100644 index 0000000..a41e3c1 --- /dev/null +++ b/examples/all/manifests/thanos-sidecar-serviceMonitor.yaml @@ -0,0 +1,24 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + labels: + app.kubernetes.io/component: prometheus-sidecar + app.kubernetes.io/instance: thanos-sidecar + app.kubernetes.io/name: thanos-sidecar + app.kubernetes.io/version: v0.17.2 + name: thanos-sidecar + namespace: thanos +spec: + endpoints: + - port: http + relabelings: + - separator: / + sourceLabels: + - namespace + - pod + targetLabel: instance + selector: + matchLabels: + app.kubernetes.io/component: prometheus-sidecar + app.kubernetes.io/instance: thanos-sidecar + app.kubernetes.io/name: thanos-sidecar diff --git a/jsonnet/kube-thanos/kube-thanos-sidecar.libsonnet b/jsonnet/kube-thanos/kube-thanos-sidecar.libsonnet new file mode 100644 index 0000000..b0bacd5 --- /dev/null +++ b/jsonnet/kube-thanos/kube-thanos-sidecar.libsonnet @@ -0,0 +1,82 @@ +// These are the defaults for this components configuration. +// When calling the function to generate the component's manifest, +// you can pass an object structured like the default to overwrite default values. +local defaults = { + local defaults = self, + name: 'thanos-sidecar', + namespace: error 'must provide namespace', + version: error 'must provide version', + serviceMonitor: false, + ports: { + grpc: 10901, + http: 10902, + }, + + commonLabels:: { + 'app.kubernetes.io/name': 'thanos-sidecar', + 'app.kubernetes.io/instance': defaults.name, + 'app.kubernetes.io/version': defaults.version, + 'app.kubernetes.io/component': 'prometheus-sidecar', + }, + + podLabelSelector:: error 'must provide podLabelSelector', + + serviceLabelSelector:: { + [labelName]: defaults.commonLabels[labelName] + for labelName in std.objectFields(defaults.commonLabels) + if !std.setMember(labelName, ['app.kubernetes.io/version']) + }, +}; + +function(params) { + local tsc = self, + config:: defaults + params, + + service: { + apiVersion: 'v1', + kind: 'Service', + metadata: { + name: tsc.config.name, + namespace: tsc.config.namespace, + labels: tsc.config.commonLabels, + }, + spec: { + clusterIP: 'None', + selector: tsc.config.podLabelSelector, + ports: [ + { + assert std.isString(name), + assert std.isNumber(tsc.config.ports[name]), + + name: name, + port: tsc.config.ports[name], + targetPort: tsc.config.ports[name], + } + for name in std.objectFields(tsc.config.ports) + ], + }, + }, + + serviceMonitor: if tsc.config.serviceMonitor == true then { + apiVersion: 'monitoring.coreos.com/v1', + kind: 'ServiceMonitor', + metadata+: { + name: tsc.config.name, + namespace: tsc.config.namespace, + labels: tsc.config.commonLabels, + }, + spec: { + selector: { + matchLabels: tsc.config.serviceLabelSelector, + }, + relabelings: [{ + sourceLabels: ['namespace', 'pod'], + separator: '/', + targetLabel: 'instance', + }], + endpoints: [ + { port: 'http' }, + ], + }, + }, +} diff --git a/jsonnet/kube-thanos/thanos.libsonnet b/jsonnet/kube-thanos/thanos.libsonnet index f6146f7..22fd4d3 100644 --- a/jsonnet/kube-thanos/thanos.libsonnet +++ b/jsonnet/kube-thanos/thanos.libsonnet @@ -5,6 +5,7 @@ receive: (import 'kube-thanos-receive.libsonnet'), receiveHashrings: (import 'kube-thanos-receive-hashrings.libsonnet'), rule: (import 'kube-thanos-rule.libsonnet'), + sidecar: (import 'kube-thanos-sidecar.libsonnet'), store: (import 'kube-thanos-store.libsonnet'), storeShards: (import 'kube-thanos-store-shards.libsonnet'), queryFrontend: (import 'kube-thanos-query-frontend.libsonnet'),