diff --git a/jsonnet/kube-prometheus/kube-prometheus-thanos.libsonnet b/jsonnet/kube-prometheus/kube-prometheus-thanos.libsonnet index 28b76dff2e5533ef2f24b26d965d9ba3404c2d8f..e37df7b7f6310a43dee4dece63a0cf4d26e4feec 100644 --- a/jsonnet/kube-prometheus/kube-prometheus-thanos.libsonnet +++ b/jsonnet/kube-prometheus/kube-prometheus-thanos.libsonnet @@ -2,15 +2,20 @@ local k = import 'ksonnet/ksonnet.beta.3/k.libsonnet'; local service = k.core.v1.service; local servicePort = k.core.v1.service.mixin.spec.portsType; - { _config+:: { versions+:: { - thanos: 'v0.1.0', + thanos: 'v0.2.1', }, imageRepos+:: { thanos: 'improbable/thanos', }, + thanos+:: { + objectStorageConfig: { + key: 'thanos.yaml', // How the file inside the secret is called + name: 'thanos-objstore-config', // This is the name of your Kubernetes secret with the config + }, + }, }, prometheus+:: { prometheus+: { @@ -22,9 +27,16 @@ local servicePort = k.core.v1.service.mixin.spec.portsType; peers: 'thanos-peers.' + $._config.namespace + '.svc:10900', version: $._config.versions.thanos, baseImage: $._config.imageRepos.thanos, + objectStorageConfig: $._config.thanos.objectStorageConfig, }, }, }, + thanosPeerService: + local thanosPeerPort = servicePort.newNamed('cluster', 10900, 'cluster'); + service.new('thanos-peers', { 'thanos-peer': 'true' }, thanosPeerPort) + + service.mixin.metadata.withNamespace($._config.namespace) + + service.mixin.spec.withType('ClusterIP') + + service.mixin.spec.withClusterIp('None'), thanosQueryDeployment: local deployment = k.apps.v1beta2.deployment; local container = k.apps.v1beta2.deployment.mixin.spec.template.spec.containersType; @@ -54,11 +66,47 @@ local servicePort = k.core.v1.service.mixin.spec.portsType; service.new('thanos-query', { app: 'thanos-query' }, thanosQueryPort) + service.mixin.metadata.withNamespace($._config.namespace) + service.mixin.metadata.withLabels({ app: 'thanos-query' }), - thanosPeerService: - local thanosPeerPort = servicePort.newNamed('cluster', 10900, 'cluster'); - service.new('thanos-peers', { 'thanos-peer': 'true' }, thanosPeerPort) + - service.mixin.metadata.withNamespace($._config.namespace) + - service.mixin.spec.withType('ClusterIP') + - service.mixin.spec.withClusterIp('None'), + + thanosStoreStatefulset: + local statefulSet = k.apps.v1beta2.statefulSet; + local volume = statefulSet.mixin.spec.template.spec.volumesType; + local container = statefulSet.mixin.spec.template.spec.containersType; + local containerEnv = container.envType; + local containerVolumeMount = container.volumeMountsType; + + local labels = { app: 'thanos', 'thanos-peer': 'true' }; + + local c = + container.new('thanos-store', $._config.imageRepos.thanos + ':' + $._config.versions.thanos) + + container.withArgs([ + 'store', + '--log.level=debug', + '--data-dir=/var/thanos/store', + '--cluster.peers=thanos-peers.' + $._config.namespace + '.svc:10900', + '--objstore.config=$(OBJSTORE_CONFIG)', + ]) + + container.withEnv([ + containerEnv.fromSecretRef( + 'OBJSTORE_CONFIG', + $._config.thanos.objectStorageConfig.name, + $._config.thanos.objectStorageConfig.key, + ), + ]) + + container.withPorts([ + { name: 'cluster', containerPort: 10900 }, + { name: 'grpc', containerPort: 10901 }, + { name: 'http', containerPort: 10902 }, + ]) + + container.withVolumeMounts([ + containerVolumeMount.new('data', '/var/thanos/store', false), + ]); + + statefulSet.new('thanos-store', 1, c, [], labels) + + statefulSet.mixin.metadata.withNamespace($._config.namespace) + + statefulSet.mixin.spec.selector.withMatchLabels(labels) + + statefulSet.mixin.spec.withServiceName('thanos-store') + + statefulSet.mixin.spec.template.spec.withVolumes([ + volume.fromEmptyDir('data'), + ]), }, }