From 3a8375689f0ce11fcdfaa64575c92111976eef83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraci=20Paix=C3=A3o=20Kr=C3=B6hling?= Date: Tue, 10 Sep 2019 14:16:34 +0200 Subject: [PATCH 1/2] Added jaeger all in one with badger storage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Juraci Paixão Kröhling --- components/jaeger-collector.libsonnet | 71 +++++++++++++++++++ environments/kubernetes/jaeger.libsonnet | 1 + environments/kubernetes/main.jsonnet | 6 +- .../manifests/jaeger-deployment.yaml | 42 +++++++++++ .../manifests/jaeger-headlessService.yaml | 15 ++++ .../manifests/jaeger-queryService.yaml | 14 ++++ .../manifests/jaeger-volumeClaim.yaml | 14 ++++ 7 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 components/jaeger-collector.libsonnet create mode 100644 environments/kubernetes/jaeger.libsonnet create mode 100644 environments/kubernetes/manifests/jaeger-deployment.yaml create mode 100644 environments/kubernetes/manifests/jaeger-headlessService.yaml create mode 100644 environments/kubernetes/manifests/jaeger-queryService.yaml create mode 100644 environments/kubernetes/manifests/jaeger-volumeClaim.yaml diff --git a/components/jaeger-collector.libsonnet b/components/jaeger-collector.libsonnet new file mode 100644 index 000000000..09380b46d --- /dev/null +++ b/components/jaeger-collector.libsonnet @@ -0,0 +1,71 @@ +local k = import 'ksonnet/ksonnet.beta.4/k.libsonnet'; +local service = k.core.v1.service; + +{ + jaeger+:: { + headlessService: + service.new( + 'jaeger-collector-headless', + $.jaeger.deployment.metadata.labels, + [ + service.mixin.spec.portsType.newNamed('grpc', 14250, 14250), + ], + ) + + service.mixin.metadata.withNamespace('observatorium') + + service.mixin.metadata.withLabels({ 'app.kubernetes.io/name': $.jaeger.deployment.metadata.name }) + + service.mixin.spec.withClusterIp('None'), + + queryService: + service.new( + 'jaeger-query', + $.jaeger.deployment.metadata.labels, + [ + service.mixin.spec.portsType.newNamed('query', 16686, 16686), + ], + ) + + service.mixin.metadata.withNamespace('observatorium') + + service.mixin.metadata.withLabels({ 'app.kubernetes.io/name': $.jaeger.deployment.metadata.name }), + + volumeClaim: + local claim = k.core.v1.persistentVolumeClaim; + claim.new() + + claim.mixin.metadata.withName('jaeger-store-data') + + claim.mixin.metadata.withNamespace('observatorium') + + claim.mixin.metadata.withLabels({ 'app.kubernetes.io/name': $.jaeger.deployment.metadata.name }) + + claim.mixin.spec.withAccessModes('ReadWriteOnce') + + claim.mixin.spec.resources.withRequests({ storage: '50Gi' },) + + claim.mixin.spec.withStorageClassName('standard'), + + deployment: + local deployment = k.apps.v1.deployment; + local container = deployment.mixin.spec.template.spec.containersType; + local containerPort = container.portsType; + local env = container.envType; + local mount = container.volumeMountsType; + local volume = k.apps.v1.statefulSet.mixin.spec.template.spec.volumesType; + + local c = + container.new($.jaeger.deployment.metadata.name, 'jaegertracing/all-in-one:1.14.0') + + container.withArgs([ + '--badger.directory-key=/var/jaeger/store/keys', + '--badger.directory-value=/var/jaeger/store/values', + '--badger.ephemeral=false', + ],) + + container.withEnv([ + env.new('SPAN_STORAGE_TYPE', 'badger'), + ]) + container.withPorts( + [ + containerPort.newNamed(14250, 'grpc'), + containerPort.newNamed(14269, 'admin-http'), + containerPort.newNamed(16686, 'query'), + ], + ) + + container.withVolumeMounts([mount.new('jaeger-store-data', '/var/jaeger/store')]); + + deployment.new('jaeger-all-in-one', 1, c, $.jaeger.deployment.metadata.labels) + + deployment.mixin.metadata.withNamespace('observatorium') + + deployment.mixin.metadata.withLabels({ 'app.kubernetes.io/name': $.jaeger.deployment.metadata.name }) + + deployment.mixin.spec.selector.withMatchLabels($.jaeger.deployment.metadata.labels) + + deployment.mixin.spec.template.spec.withVolumes(volume.fromPersistentVolumeClaim($.jaeger.volumeClaim.metadata.name, $.jaeger.volumeClaim.metadata.name)), + }, +} diff --git a/environments/kubernetes/jaeger.libsonnet b/environments/kubernetes/jaeger.libsonnet new file mode 100644 index 000000000..e0e0703fa --- /dev/null +++ b/environments/kubernetes/jaeger.libsonnet @@ -0,0 +1 @@ +(import '../../components/jaeger-collector.libsonnet') diff --git a/environments/kubernetes/main.jsonnet b/environments/kubernetes/main.jsonnet index c785cbd43..a651c8f19 100644 --- a/environments/kubernetes/main.jsonnet +++ b/environments/kubernetes/main.jsonnet @@ -1,6 +1,7 @@ local app = (import 'kube-thanos.libsonnet') + - (import 'telemeter.libsonnet'); + (import 'telemeter.libsonnet') + + (import 'jaeger.libsonnet'); { ['thanos-querier-' + name]: app.thanos.querier[name] for name in std.objectFields(app.thanos.querier) } + { ['thanos-receive-' + name]: app.thanos.receive[name] for name in std.objectFields(app.thanos.receive) } + @@ -8,4 +9,5 @@ local app = { ['thanos-store-' + name]: app.thanos.store[name] for name in std.objectFields(app.thanos.store) } + { ['thanos-receive-controller-' + name]: app.thanos.receiveController[name] for name in std.objectFields(app.thanos.receiveController) } + { ['thanos-querier-cache-' + name]: app.thanos.querierCache[name] for name in std.objectFields(app.thanos.querierCache) } + -{ ['telemeter-' + name]: app.telemeterServer[name] for name in std.objectFields(app.telemeterServer) } +{ ['telemeter-' + name]: app.telemeterServer[name] for name in std.objectFields(app.telemeterServer) } + +{ ['jaeger-' + name]: app.jaeger[name] for name in std.objectFields(app.jaeger) } diff --git a/environments/kubernetes/manifests/jaeger-deployment.yaml b/environments/kubernetes/manifests/jaeger-deployment.yaml new file mode 100644 index 000000000..61f575cfc --- /dev/null +++ b/environments/kubernetes/manifests/jaeger-deployment.yaml @@ -0,0 +1,42 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/name: jaeger-all-in-one + name: jaeger-all-in-one + namespace: observatorium +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: jaeger-all-in-one + template: + metadata: + labels: + app.kubernetes.io/name: jaeger-all-in-one + spec: + containers: + - args: + - --badger.directory-key=/var/jaeger/store/keys + - --badger.directory-value=/var/jaeger/store/values + - --badger.ephemeral=false + env: + - name: SPAN_STORAGE_TYPE + value: badger + image: jaegertracing/all-in-one:1.14.0 + name: jaeger-all-in-one + ports: + - containerPort: 14250 + name: grpc + - containerPort: 14269 + name: admin-http + - containerPort: 16686 + name: query + volumeMounts: + - mountPath: /var/jaeger/store + name: jaeger-store-data + readOnly: false + volumes: + - name: jaeger-store-data + persistentVolumeClaim: + claimName: jaeger-store-data diff --git a/environments/kubernetes/manifests/jaeger-headlessService.yaml b/environments/kubernetes/manifests/jaeger-headlessService.yaml new file mode 100644 index 000000000..6d23bbc5e --- /dev/null +++ b/environments/kubernetes/manifests/jaeger-headlessService.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: jaeger-all-in-one + name: jaeger-collector-headless + namespace: observatorium +spec: + clusterIP: None + ports: + - name: grpc + port: 14250 + targetPort: 14250 + selector: + app.kubernetes.io/name: jaeger-all-in-one diff --git a/environments/kubernetes/manifests/jaeger-queryService.yaml b/environments/kubernetes/manifests/jaeger-queryService.yaml new file mode 100644 index 000000000..ba93f5911 --- /dev/null +++ b/environments/kubernetes/manifests/jaeger-queryService.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: jaeger-all-in-one + name: jaeger-query + namespace: observatorium +spec: + ports: + - name: query + port: 16686 + targetPort: 16686 + selector: + app.kubernetes.io/name: jaeger-all-in-one diff --git a/environments/kubernetes/manifests/jaeger-volumeClaim.yaml b/environments/kubernetes/manifests/jaeger-volumeClaim.yaml new file mode 100644 index 000000000..e6daa1229 --- /dev/null +++ b/environments/kubernetes/manifests/jaeger-volumeClaim.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + labels: + app.kubernetes.io/name: jaeger-all-in-one + name: jaeger-store-data + namespace: observatorium +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 50Gi + storageClassName: standard From c97e428686e05510337749e0f8130f251cd73c0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraci=20Paix=C3=A3o=20Kr=C3=B6hling?= Date: Thu, 12 Sep 2019 14:15:04 +0200 Subject: [PATCH 2/2] Added limits/requests and liveness/readiness probes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Juraci Paixão Kröhling --- components/jaeger-collector.libsonnet | 12 ++++++++++- .../manifests/jaeger-deployment.yaml | 20 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/components/jaeger-collector.libsonnet b/components/jaeger-collector.libsonnet index 09380b46d..2b81d7268 100644 --- a/components/jaeger-collector.libsonnet +++ b/components/jaeger-collector.libsonnet @@ -44,12 +44,16 @@ local service = k.core.v1.service; local mount = container.volumeMountsType; local volume = k.apps.v1.statefulSet.mixin.spec.template.spec.volumesType; + // the assumption based on past perf tests is that this collector should be able to comfortably + // ingest at least 2k spans/sec with badger and 256Mi of memory on 1 cpu. + // this depends on the span size, but these default values should provide a good base line local c = container.new($.jaeger.deployment.metadata.name, 'jaegertracing/all-in-one:1.14.0') + container.withArgs([ '--badger.directory-key=/var/jaeger/store/keys', '--badger.directory-value=/var/jaeger/store/values', '--badger.ephemeral=false', + '--collector.queue-size=4000', ],) + container.withEnv([ env.new('SPAN_STORAGE_TYPE', 'badger'), @@ -60,7 +64,13 @@ local service = k.core.v1.service; containerPort.newNamed(16686, 'query'), ], ) + - container.withVolumeMounts([mount.new('jaeger-store-data', '/var/jaeger/store')]); + container.withVolumeMounts([mount.new('jaeger-store-data', '/var/jaeger/store')]) + + container.mixin.readinessProbe.withFailureThreshold(3) + + container.mixin.readinessProbe.httpGet.withPath('/').withPort('14269').withScheme('HTTP') + + container.mixin.livenessProbe.withFailureThreshold(3) + + container.mixin.livenessProbe.httpGet.withPath('/').withPort('14269').withScheme('HTTP') + + container.mixin.resources.withRequests({ cpu: '1', memory: '256Mi' }) + + container.mixin.resources.withLimits({ cpu: '4', memory: '2Gi' }); deployment.new('jaeger-all-in-one', 1, c, $.jaeger.deployment.metadata.labels) + deployment.mixin.metadata.withNamespace('observatorium') + diff --git a/environments/kubernetes/manifests/jaeger-deployment.yaml b/environments/kubernetes/manifests/jaeger-deployment.yaml index 61f575cfc..f76d5ee63 100644 --- a/environments/kubernetes/manifests/jaeger-deployment.yaml +++ b/environments/kubernetes/manifests/jaeger-deployment.yaml @@ -20,10 +20,17 @@ spec: - --badger.directory-key=/var/jaeger/store/keys - --badger.directory-value=/var/jaeger/store/values - --badger.ephemeral=false + - --collector.queue-size=4000 env: - name: SPAN_STORAGE_TYPE value: badger image: jaegertracing/all-in-one:1.14.0 + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: "14269" + scheme: HTTP name: jaeger-all-in-one ports: - containerPort: 14250 @@ -32,6 +39,19 @@ spec: name: admin-http - containerPort: 16686 name: query + readinessProbe: + failureThreshold: 3 + httpGet: + path: / + port: "14269" + scheme: HTTP + resources: + limits: + cpu: "4" + memory: 2Gi + requests: + cpu: "1" + memory: 256Mi volumeMounts: - mountPath: /var/jaeger/store name: jaeger-store-data