From 5b9097174d5c74fa590bcb95ac1a2f6ed277780a Mon Sep 17 00:00:00 2001 From: Anand Sanmukhani Date: Fri, 21 May 2021 11:55:26 -0400 Subject: [PATCH] Make Loki Compute resources configurable --- api/v1alpha1/observatorium_types.go | 3 + api/v1alpha1/zz_generated.deepcopy.go | 7 ++ example/main.jsonnet | 5 +- example/manifests/observatorium.yaml | 68 ++++++++++++++----- jsonnet/jsonnetfile.json | 4 +- jsonnet/jsonnetfile.lock.json | 18 ++--- jsonnet/obs-operator.jsonnet | 7 +- .../core.observatorium.io_observatoria.yaml | 25 +++++++ 8 files changed, 105 insertions(+), 32 deletions(-) diff --git a/api/v1alpha1/observatorium_types.go b/api/v1alpha1/observatorium_types.go index e4847b69..af52b194 100644 --- a/api/v1alpha1/observatorium_types.go +++ b/api/v1alpha1/observatorium_types.go @@ -378,6 +378,9 @@ type LokiSpec struct { Version string `json:"version,omitempty"` // VolumeClaimTemplate VolumeClaimTemplate VolumeClaimTemplate `json:"volumeClaimTemplate"` + // Compute Resources required by each component containers. + // +optional + Resources map[string]v1.ResourceRequirements `json:"resources,omitempty"` } // ObservatoriumStatus defines the observed state of Observatorium diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index 1c6c71d9..acdff037 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -177,6 +177,13 @@ func (in *LokiSpec) DeepCopyInto(out *LokiSpec) { } } in.VolumeClaimTemplate.DeepCopyInto(&out.VolumeClaimTemplate) + if in.Resources != nil { + in, out := &in.Resources, &out.Resources + *out = make(map[string]v1.ResourceRequirements, len(*in)) + for key, val := range *in { + (*out)[key] = *val.DeepCopy() + } + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LokiSpec. diff --git a/example/main.jsonnet b/example/main.jsonnet index 1d7fb671..ba61648b 100644 --- a/example/main.jsonnet +++ b/example/main.jsonnet @@ -1,6 +1,6 @@ -local obs = (import 'github.com/observatorium/deployments/components/observatorium.libsonnet'); +local obs = (import 'github.com/4n4nd/observatorium/configuration/components/observatorium.libsonnet'); -local dex = (import 'github.com/observatorium/deployments/components/dex.libsonnet')({ +local dex = (import 'github.com/4n4nd/observatorium/configuration/components/dex.libsonnet')({ local cfg = self, name: 'dex', namespace: 'dex', @@ -167,6 +167,7 @@ local dex = (import 'github.com/observatorium/deployments/components/dex.libsonn loki: { image: obs.loki.config.image, replicas: obs.loki.config.replicas, + resources: obs.loki.config.resources, version: obs.loki.config.version, volumeClaimTemplate: obs.loki.config.volumeClaimTemplate, }, diff --git a/example/manifests/observatorium.yaml b/example/manifests/observatorium.yaml index bc7b9c5e..33d68f12 100644 --- a/example/manifests/observatorium.yaml +++ b/example/manifests/observatorium.yaml @@ -47,16 +47,16 @@ spec: secretName: observatorium-xyz-tls version: master-2020-11-02-v0.1.1-192-ge324057 apiQuery: - image: quay.io/thanos/thanos:v0.17.1 - version: v0.17.1 + image: quay.io/thanos/thanos:v0.20.1 + version: v0.20.1 compact: enableDownsampling: false - image: quay.io/thanos/thanos:v0.17.1 + image: quay.io/thanos/thanos:v0.20.1 replicas: 1 retentionResolution1h: 1s retentionResolution5m: 1s retentionResolutionRaw: 14d - version: v0.17.1 + version: v0.20.1 volumeClaimTemplate: spec: accessModes: @@ -68,14 +68,50 @@ spec: - hashring: default tenants: [] loki: - image: docker.io/grafana/loki:2.1.0 + image: docker.io/grafana/loki:2.2.0 replicas: compactor: 1 distributor: 1 ingester: 1 querier: 1 query_frontend: 1 - version: 2.1.0 + resources: + compactor: + limits: + cpu: 200m + memory: 200Mi + requests: + cpu: 100m + memory: 100Mi + distributor: + limits: + cpu: 200m + memory: 200Mi + requests: + cpu: 100m + memory: 100Mi + ingester: + limits: + cpu: 200m + memory: 200Mi + requests: + cpu: 100m + memory: 100Mi + querier: + limits: + cpu: 200m + memory: 200Mi + requests: + cpu: 100m + memory: 100Mi + query_frontend: + limits: + cpu: 200m + memory: 200Mi + requests: + cpu: 100m + memory: 100Mi + version: 2.2.0 volumeClaimTemplate: spec: accessModes: @@ -95,17 +131,17 @@ spec: key: thanos.yaml name: thanos-objectstorage query: - image: quay.io/thanos/thanos:v0.17.1 + image: quay.io/thanos/thanos:v0.20.1 replicas: 1 - version: v0.17.1 + version: v0.20.1 queryFrontend: - image: quay.io/thanos/thanos:v0.17.1 + image: quay.io/thanos/thanos:v0.20.1 replicas: 1 - version: v0.17.1 + version: v0.20.1 receivers: - image: quay.io/thanos/thanos:v0.17.1 + image: quay.io/thanos/thanos:v0.20.1 replicas: 1 - version: v0.17.1 + version: v0.20.1 volumeClaimTemplate: spec: accessModes: @@ -114,9 +150,9 @@ spec: requests: storage: 50Gi rule: - image: quay.io/thanos/thanos:v0.17.1 + image: quay.io/thanos/thanos:v0.20.1 replicas: 1 - version: v0.17.1 + version: v0.20.1 volumeClaimTemplate: spec: accessModes: @@ -135,9 +171,9 @@ spec: memoryLimitMb: 1024 replicas: 1 version: 1.6.3-alpine - image: quay.io/thanos/thanos:v0.17.1 + image: quay.io/thanos/thanos:v0.20.1 shards: 1 - version: v0.17.1 + version: v0.20.1 volumeClaimTemplate: spec: accessModes: diff --git a/jsonnet/jsonnetfile.json b/jsonnet/jsonnetfile.json index 671d6bc1..bcb1c8f0 100644 --- a/jsonnet/jsonnetfile.json +++ b/jsonnet/jsonnetfile.json @@ -4,11 +4,11 @@ { "source": { "git": { - "remote": "https://github.com/observatorium/observatorium.git", + "remote": "https://github.com/4n4nd/observatorium.git", "subdir": "configuration" } }, - "version": "main" + "version": "update-loki-resources" } ], "legacyImports": true diff --git a/jsonnet/jsonnetfile.lock.json b/jsonnet/jsonnetfile.lock.json index 6deb2c52..1ce5f64c 100644 --- a/jsonnet/jsonnetfile.lock.json +++ b/jsonnet/jsonnetfile.lock.json @@ -4,23 +4,23 @@ { "source": { "git": { - "remote": "https://github.com/observatorium/api.git", - "subdir": "jsonnet/lib" + "remote": "https://github.com/4n4nd/observatorium.git", + "subdir": "configuration" } }, - "version": "cbff1da9ba9371516a6254db359ae33545aefdf7", - "sum": "Z86CgnoTybhpdQKWc2ptURmps1d9Qxhec0/IK6v71kY=", - "name": "observatorium-api" + "version": "20e7404ce136862ea587b7e1799619a7ba7333be", + "sum": "DWWnTMgW80vFSB//tJRqux0tHfthyBfRFi1DA1glU4k=" }, { "source": { "git": { - "remote": "https://github.com/observatorium/observatorium.git", - "subdir": "configuration" + "remote": "https://github.com/observatorium/api.git", + "subdir": "jsonnet/lib" } }, - "version": "8f5144ea1f8d86bce5e0b5ab7186f2b882f544dd", - "sum": "JJw7XVf0i3iBxjHrs/AgMQCVdNQgT6RlETcgVdSYUuk=" + "version": "cbff1da9ba9371516a6254db359ae33545aefdf7", + "sum": "Z86CgnoTybhpdQKWc2ptURmps1d9Qxhec0/IK6v71kY=", + "name": "observatorium-api" }, { "source": { diff --git a/jsonnet/obs-operator.jsonnet b/jsonnet/obs-operator.jsonnet index b9ae7150..fc301874 100644 --- a/jsonnet/obs-operator.jsonnet +++ b/jsonnet/obs-operator.jsonnet @@ -1,8 +1,8 @@ local cr = import 'generic-operator/config'; -local thanos = (import 'github.com/observatorium/observatorium/configuration/components/thanos.libsonnet'); -local loki = (import 'github.com/observatorium/observatorium/configuration/components/loki.libsonnet'); +local thanos = (import 'github.com/4n4nd/observatorium/configuration/components/thanos.libsonnet'); +local loki = (import 'github.com/4n4nd/observatorium/configuration/components/loki.libsonnet'); local api = (import 'github.com/observatorium/api/jsonnet/lib/observatorium-api.libsonnet'); -local obs = (import 'github.com/observatorium/observatorium/configuration/components/observatorium.libsonnet'); +local obs = (import 'github.com/4n4nd/observatorium/configuration/components/observatorium.libsonnet'); local operatorObs = obs { @@ -68,6 +68,7 @@ local operatorObs = obs { image: if std.objectHas(cr.spec.loki, 'image') then cr.spec.loki.image else obs.loki.config.image, replicas: if std.objectHas(cr.spec.loki, 'replicas') then cr.spec.loki.replicas else obs.loki.config.replicas, version: if std.objectHas(cr.spec.loki, 'version') then cr.spec.loki.version else obs.loki.config.version, + resources: if std.objectHas(cr.spec.loki, 'resources') then cr.spec.loki.resources else obs.loki.config.resources, objectStorageConfig: if cr.spec.objectStorageConfig.loki != null then cr.spec.objectStorageConfig.loki else obs.loki.config.objectStorageConfig, }) else {}, diff --git a/manifests/crds/core.observatorium.io_observatoria.yaml b/manifests/crds/core.observatorium.io_observatoria.yaml index c1736d82..3ebd9186 100644 --- a/manifests/crds/core.observatorium.io_observatoria.yaml +++ b/manifests/crds/core.observatorium.io_observatoria.yaml @@ -728,6 +728,31 @@ spec: type: integer description: Loki replicas per component type: object + resources: + additionalProperties: + description: ResourceRequirements describes the compute resource requirements. + properties: + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + type: object + description: Compute Resources required by each component containers. + type: object version: description: Version of Loki image to be deployed type: string