From 0f37fbd0c5540bd1b7471ddd3abed7fcf65bf067 Mon Sep 17 00:00:00 2001 From: Jake Briggs Date: Thu, 14 Nov 2024 08:14:05 -0600 Subject: [PATCH 1/8] Update infrastructure-gateway-api.md (#553) --- docs/infrastructure-gateway-api.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/infrastructure-gateway-api.md b/docs/infrastructure-gateway-api.md index c72f0a2e..f3aecb1b 100644 --- a/docs/infrastructure-gateway-api.md +++ b/docs/infrastructure-gateway-api.md @@ -75,15 +75,15 @@ There are various implementations of the Gateway API. In this document, we will --namespace=nginx-gateway \ --wait \ --timeout 10m \ - -f /opt/genestack/base-helm-configs/nginx-gateway-fabric/helm-overrides.yaml \ - --post-renderer /opt/genestack/base-kustomize/kustomize.sh \ + -f /etc/genestack/helm-configs/nginx-gateway-fabric/helm-overrides.yaml \ + --post-renderer /etc/genestack/kustomize/kustomize.sh \ --post-renderer-args gateway/base ``` === "Experimental" ``` shell - cd /opt/genestack/submodules/nginx-gateway-fabric/charts/nginx-gateway-fabric + cd /opt/genestack/submodules/nginx-gateway-fabric/charts helm upgrade --install nginx-gateway-fabric . \ --namespace=nginx-gateway \ From fa87c015adcc20192f572e9ec83bc9ea23203fe4 Mon Sep 17 00:00:00 2001 From: retreved Date: Thu, 14 Nov 2024 08:48:59 -0600 Subject: [PATCH 2/8] Logging docs (#562) * [docs] adding genestack logging doc * [docs]document edits and TOC in mkdocs * [docs]grammatical fixes * [docs]fixed file name * [docs]fix link error again * whitespace removal services, llc * [docs]another visit by the whitespace fairie, file renames * [docs]two minor fixes * [docs]minor fixes --------- Co-authored-by: Chris Breu --- docs/genestack-logging.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/genestack-logging.md b/docs/genestack-logging.md index a7a3bc85..1c62f82c 100644 --- a/docs/genestack-logging.md +++ b/docs/genestack-logging.md @@ -1,12 +1,12 @@ -#@ Genestack Logging +# Genestack Logging [TOC] -### Overview +### Introduction Genestack logging is a straight forward system that collects, stores and provides an interface to search and read logs on-demand. The storage backend is open to fit the needs of your deployment, so whether backing up to Openstack Swift, S3, Ceph, or file-share, Genestack logging can fit in your environment. -Out of box Genestack logging is comprised of three separate technologies: +Out-of-box Genestack logging is comprised of three separate technologies: - [Fluentbit](https://fluentbit.io/), a fast and lightweight telemetry agent for logs, metrics, and traces for Linux, macOS, Windows, and BSD family operating systems. Fluentbit grabs log entries immediately from your Kubernetes application and ships them to Loki for aggregation - [Loki](https://github.com/grafana/loki), a log aggregation system for Kubernetes that stores logs in a time series database and is often used with Grafana to visualize them. From 588296eeebb29624e895d42ecd520aa9feb44b8f Mon Sep 17 00:00:00 2001 From: Luke Repko Date: Thu, 14 Nov 2024 22:07:59 -0600 Subject: [PATCH 3/8] docs: OSPC-367 improve operator restore info (#565) * docs: OSPC-367 Expand on operator restore opts The operator supports restoring a single database. That is a useful feature worth noting in our own docs for those preferring to use the operator versus manually dumping and restoring. * docs: OSPC-367 Demo checking restore status * docs: OSPC-367 Move operator tips toward the top --- docs/infrastructure-mariadb-ops.md | 49 +++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/docs/infrastructure-mariadb-ops.md b/docs/infrastructure-mariadb-ops.md index dc95558d..2eb465eb 100644 --- a/docs/infrastructure-mariadb-ops.md +++ b/docs/infrastructure-mariadb-ops.md @@ -87,9 +87,40 @@ dump to your MariaDB database. Refer to the mariadb-operator [restore documentation](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/BACKUP.md#restore) for more information. +!!! tip "Operator Restore Tips" + + 1. If you have multiple backups available, the operator is able to infer + which backup to restore based on the `spec.targetRecoveryTime` field + discussed in the operator documentation [here](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/BACKUP.md#target-recovery-time). + 2. The referred database (db1 in the example below) must previously exist + for the Restore to succeed. + 3. The mariadb CLI invoked by the operator under the hood only supports + selecting a single database to restore via the `--one-database` option, + restoration of multiple specific databases is not supported. + +### Restore All Databases + +!!! danger "The following command may lead to data loss" + + ``` shell + cat < Date: Fri, 15 Nov 2024 19:24:38 +0530 Subject: [PATCH 4/8] Update resource requests in Helm overrides and tune HPA configurations (#566) * Add DEF_TAG_NAME to env in release-heat-rxt.yml to fix empty imageTag issue * Tune hpa values and rename docker image heat-rxt to heat * Update resource requests in Helm Overrides and fine-tune HPA configurations --- .../ceilometer/ceilometer-helm-overrides.yaml | 2 +- base-helm-configs/glance/glance-helm-overrides.yaml | 2 +- base-helm-configs/heat/heat-helm-overrides.yaml | 2 +- .../keystone/keystone-helm-overrides.yaml | 2 +- base-helm-configs/magnum/magnum-helm-overrides.yaml | 2 +- .../neutron/neutron-helm-overrides.yaml | 4 ++-- base-helm-configs/nova/nova-helm-overrides.yaml | 12 ++++++------ .../octavia/octavia-helm-overrides.yaml | 4 ++-- .../placement/placement-helm-overrides.yaml | 2 +- .../postgresql/postgresql-helm-overrides.yaml | 4 ++-- base-kustomize/barbican/base/hpa-barbican-api.yaml | 10 ++++++++-- .../ceilometer/base/hpa-ceilometer-notification.yaml | 6 ++++++ base-kustomize/cinder/base/hpa-cinder-api.yaml | 6 ++++++ base-kustomize/cinder/base/hpa-cinder-scheduler.yaml | 6 ++++++ base-kustomize/designate/base/hpa-designate-api.yaml | 6 ++++++ base-kustomize/glance/base/hpa-glance-api.yaml | 6 ++++++ base-kustomize/gnocchi/base/hpa-gnocchi-api.yaml | 6 ++++++ base-kustomize/heat/base/hpa-heat-api.yaml | 6 ++++++ base-kustomize/heat/base/hpa-heat-cfn.yaml | 6 ++++++ base-kustomize/heat/base/hpa-heat-engine.yaml | 6 ++++++ base-kustomize/horizon/base/hpa-horizon-api.yaml | 6 ++++++ base-kustomize/keystone/base/hpa-keystone-api.yaml | 6 ++++++ base-kustomize/magnum/base/hpa-magnum-api.yaml | 6 ++++++ base-kustomize/magnum/base/hpa-magnum-conductor.yaml | 4 ++-- base-kustomize/neutron/base/hpa-neutron-server.yaml | 8 +++++++- base-kustomize/nova/base/hpa-nova-api-metadata.yaml | 6 ++++++ base-kustomize/nova/base/hpa-nova-api-osapi.yaml | 6 ++++++ base-kustomize/nova/base/hpa-nova-conductor.yaml | 8 +++++++- base-kustomize/nova/base/hpa-nova-novncproxy.yaml | 6 ++++++ base-kustomize/nova/base/hpa-nova-scheduler.yaml | 8 +++++++- base-kustomize/octavia/base/hpa-octavia-api.yaml | 6 ++++++ base-kustomize/octavia/base/hpa-octavia-worker.yaml | 6 ++++++ base-kustomize/placement/base/hpa-placement-api.yaml | 6 ++++++ .../skyline/base/deployment-apiserver.yaml | 4 ++-- .../skyline/base/hpa-skyline-apiserver.yaml | 6 ++++++ 35 files changed, 165 insertions(+), 27 deletions(-) diff --git a/base-helm-configs/ceilometer/ceilometer-helm-overrides.yaml b/base-helm-configs/ceilometer/ceilometer-helm-overrides.yaml index 252831c7..37caa96f 100644 --- a/base-helm-configs/ceilometer/ceilometer-helm-overrides.yaml +++ b/base-helm-configs/ceilometer/ceilometer-helm-overrides.yaml @@ -2028,7 +2028,7 @@ pod: cpu: "2000m" notification: requests: - memory: "128Mi" + memory: "256Mi" cpu: "100m" limits: memory: "1024Mi" diff --git a/base-helm-configs/glance/glance-helm-overrides.yaml b/base-helm-configs/glance/glance-helm-overrides.yaml index 23c684b8..8dc96df1 100644 --- a/base-helm-configs/glance/glance-helm-overrides.yaml +++ b/base-helm-configs/glance/glance-helm-overrides.yaml @@ -886,7 +886,7 @@ pod: enabled: false api: requests: - memory: "64Mi" + memory: "128Mi" cpu: "100m" limits: memory: "4096Mi" diff --git a/base-helm-configs/heat/heat-helm-overrides.yaml b/base-helm-configs/heat/heat-helm-overrides.yaml index 9439c180..b6b260fe 100644 --- a/base-helm-configs/heat/heat-helm-overrides.yaml +++ b/base-helm-configs/heat/heat-helm-overrides.yaml @@ -1116,7 +1116,7 @@ pod: memory: "4096Mi" engine: requests: - memory: "64Mi" + memory: "128Mi" cpu: "100m" limits: memory: "4096Mi" diff --git a/base-helm-configs/keystone/keystone-helm-overrides.yaml b/base-helm-configs/keystone/keystone-helm-overrides.yaml index 214ba982..433775fe 100644 --- a/base-helm-configs/keystone/keystone-helm-overrides.yaml +++ b/base-helm-configs/keystone/keystone-helm-overrides.yaml @@ -286,7 +286,7 @@ pod: enabled: false api: requests: - memory: "64Mi" + memory: "256Mi" cpu: "100m" limits: memory: "4096Mi" diff --git a/base-helm-configs/magnum/magnum-helm-overrides.yaml b/base-helm-configs/magnum/magnum-helm-overrides.yaml index d027f31d..24b811d9 100644 --- a/base-helm-configs/magnum/magnum-helm-overrides.yaml +++ b/base-helm-configs/magnum/magnum-helm-overrides.yaml @@ -569,7 +569,7 @@ pod: cpu: "2000m" conductor: requests: - memory: "128Mi" + memory: "512Mi" cpu: "100m" limits: memory: "1024Mi" diff --git a/base-helm-configs/neutron/neutron-helm-overrides.yaml b/base-helm-configs/neutron/neutron-helm-overrides.yaml index f06df466..d1808148 100644 --- a/base-helm-configs/neutron/neutron-helm-overrides.yaml +++ b/base-helm-configs/neutron/neutron-helm-overrides.yaml @@ -769,7 +769,7 @@ pod: memory: "4096Mi" ovn_metadata: requests: - memory: "64Mi" + memory: "512Mi" cpu: "100m" limits: memory: "4096Mi" @@ -805,7 +805,7 @@ pod: memory: "4096Mi" server: requests: - memory: "64Mi" + memory: "1024Mi" cpu: "100m" limits: memory: "4096Mi" diff --git a/base-helm-configs/nova/nova-helm-overrides.yaml b/base-helm-configs/nova/nova-helm-overrides.yaml index 2ff58a1d..db0c5653 100644 --- a/base-helm-configs/nova/nova-helm-overrides.yaml +++ b/base-helm-configs/nova/nova-helm-overrides.yaml @@ -2353,8 +2353,8 @@ pod: enabled: false compute: requests: - memory: "128Mi" - cpu: "100m" + memory: "512Mi" + cpu: "200m" limits: memory: "1024Mi" cpu: "2000m" @@ -2381,15 +2381,15 @@ pod: cpu: "2000m" conductor: requests: - memory: "128Mi" - cpu: "100m" + memory: "256Mi" + cpu: "200m" limits: memory: "1024Mi" cpu: "2000m" scheduler: requests: - memory: "128Mi" - cpu: "100m" + memory: "1024Mi" + cpu: "200m" limits: memory: "1024Mi" cpu: "2000m" diff --git a/base-helm-configs/octavia/octavia-helm-overrides.yaml b/base-helm-configs/octavia/octavia-helm-overrides.yaml index 9a1b98b8..e1051892 100644 --- a/base-helm-configs/octavia/octavia-helm-overrides.yaml +++ b/base-helm-configs/octavia/octavia-helm-overrides.yaml @@ -626,13 +626,13 @@ pod: enabled: false api: requests: - memory: "64Mi" + memory: "128Mi" cpu: "100m" limits: memory: "4096Mi" worker: requests: - memory: "64Mi" + memory: "128Mi" cpu: "100m" limits: memory: "4096Mi" diff --git a/base-helm-configs/placement/placement-helm-overrides.yaml b/base-helm-configs/placement/placement-helm-overrides.yaml index a77a6ad5..02fc5111 100644 --- a/base-helm-configs/placement/placement-helm-overrides.yaml +++ b/base-helm-configs/placement/placement-helm-overrides.yaml @@ -335,7 +335,7 @@ pod: enabled: false api: requests: - memory: "64Mi" + memory: "128Mi" cpu: "100m" limits: memory: "4096Mi" diff --git a/base-helm-configs/postgresql/postgresql-helm-overrides.yaml b/base-helm-configs/postgresql/postgresql-helm-overrides.yaml index ad41ea06..e1873447 100644 --- a/base-helm-configs/postgresql/postgresql-helm-overrides.yaml +++ b/base-helm-configs/postgresql/postgresql-helm-overrides.yaml @@ -87,10 +87,10 @@ pod: enabled: false server: requests: - memory: "2048Mi" + memory: "1024Mi" cpu: "100m" limits: - memory: "1024Mi" + memory: "2048Mi" cpu: "2000m" test: requests: diff --git a/base-kustomize/barbican/base/hpa-barbican-api.yaml b/base-kustomize/barbican/base/hpa-barbican-api.yaml index bff6eed5..13748301 100644 --- a/base-kustomize/barbican/base/hpa-barbican-api.yaml +++ b/base-kustomize/barbican/base/hpa-barbican-api.yaml @@ -4,8 +4,8 @@ metadata: name: barbican-api namespace: openstack spec: - maxReplicas: 3 - minReplicas: 1 + maxReplicas: 9 + minReplicas: 3 metrics: - resource: name: cpu @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 500Mi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/ceilometer/base/hpa-ceilometer-notification.yaml b/base-kustomize/ceilometer/base/hpa-ceilometer-notification.yaml index 273c6a70..46dc5726 100644 --- a/base-kustomize/ceilometer/base/hpa-ceilometer-notification.yaml +++ b/base-kustomize/ceilometer/base/hpa-ceilometer-notification.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 500Mi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/cinder/base/hpa-cinder-api.yaml b/base-kustomize/cinder/base/hpa-cinder-api.yaml index c33b0545..7e2b67e5 100644 --- a/base-kustomize/cinder/base/hpa-cinder-api.yaml +++ b/base-kustomize/cinder/base/hpa-cinder-api.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 500Mi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/cinder/base/hpa-cinder-scheduler.yaml b/base-kustomize/cinder/base/hpa-cinder-scheduler.yaml index c4b79623..a57af571 100644 --- a/base-kustomize/cinder/base/hpa-cinder-scheduler.yaml +++ b/base-kustomize/cinder/base/hpa-cinder-scheduler.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 500Mi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/designate/base/hpa-designate-api.yaml b/base-kustomize/designate/base/hpa-designate-api.yaml index 4eca66f1..1ddacfa9 100644 --- a/base-kustomize/designate/base/hpa-designate-api.yaml +++ b/base-kustomize/designate/base/hpa-designate-api.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 500Mi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/glance/base/hpa-glance-api.yaml b/base-kustomize/glance/base/hpa-glance-api.yaml index e2e25254..9bb7eed8 100644 --- a/base-kustomize/glance/base/hpa-glance-api.yaml +++ b/base-kustomize/glance/base/hpa-glance-api.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 500Mi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/gnocchi/base/hpa-gnocchi-api.yaml b/base-kustomize/gnocchi/base/hpa-gnocchi-api.yaml index 72e5f365..83cabe49 100644 --- a/base-kustomize/gnocchi/base/hpa-gnocchi-api.yaml +++ b/base-kustomize/gnocchi/base/hpa-gnocchi-api.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 500Mi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/heat/base/hpa-heat-api.yaml b/base-kustomize/heat/base/hpa-heat-api.yaml index 96d1f25d..c4393308 100644 --- a/base-kustomize/heat/base/hpa-heat-api.yaml +++ b/base-kustomize/heat/base/hpa-heat-api.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 500Mi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/heat/base/hpa-heat-cfn.yaml b/base-kustomize/heat/base/hpa-heat-cfn.yaml index 99a6551e..2902f0b3 100644 --- a/base-kustomize/heat/base/hpa-heat-cfn.yaml +++ b/base-kustomize/heat/base/hpa-heat-cfn.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 500Mi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/heat/base/hpa-heat-engine.yaml b/base-kustomize/heat/base/hpa-heat-engine.yaml index 1276bd70..8b3d98b7 100644 --- a/base-kustomize/heat/base/hpa-heat-engine.yaml +++ b/base-kustomize/heat/base/hpa-heat-engine.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 500Mi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/horizon/base/hpa-horizon-api.yaml b/base-kustomize/horizon/base/hpa-horizon-api.yaml index aac44078..d89443bc 100644 --- a/base-kustomize/horizon/base/hpa-horizon-api.yaml +++ b/base-kustomize/horizon/base/hpa-horizon-api.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 500Mi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/keystone/base/hpa-keystone-api.yaml b/base-kustomize/keystone/base/hpa-keystone-api.yaml index c28cf739..e2c3a4a1 100644 --- a/base-kustomize/keystone/base/hpa-keystone-api.yaml +++ b/base-kustomize/keystone/base/hpa-keystone-api.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 500Mi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/magnum/base/hpa-magnum-api.yaml b/base-kustomize/magnum/base/hpa-magnum-api.yaml index 0285bd4d..53078316 100644 --- a/base-kustomize/magnum/base/hpa-magnum-api.yaml +++ b/base-kustomize/magnum/base/hpa-magnum-api.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 500Mi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/magnum/base/hpa-magnum-conductor.yaml b/base-kustomize/magnum/base/hpa-magnum-conductor.yaml index d0d61f75..677d7d05 100644 --- a/base-kustomize/magnum/base/hpa-magnum-conductor.yaml +++ b/base-kustomize/magnum/base/hpa-magnum-conductor.yaml @@ -16,8 +16,8 @@ spec: - resource: name: memory target: - averageUtilization: 60 - type: Utilization + type: AverageValue + averageValue: 1Gi type: Resource scaleTargetRef: apiVersion: apps/v1 diff --git a/base-kustomize/neutron/base/hpa-neutron-server.yaml b/base-kustomize/neutron/base/hpa-neutron-server.yaml index ef65426a..10308f27 100644 --- a/base-kustomize/neutron/base/hpa-neutron-server.yaml +++ b/base-kustomize/neutron/base/hpa-neutron-server.yaml @@ -10,9 +10,15 @@ spec: - resource: name: cpu target: - averageUtilization: 50 + averageUtilization: 70 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 2Gi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/nova/base/hpa-nova-api-metadata.yaml b/base-kustomize/nova/base/hpa-nova-api-metadata.yaml index d3295262..83a338f7 100644 --- a/base-kustomize/nova/base/hpa-nova-api-metadata.yaml +++ b/base-kustomize/nova/base/hpa-nova-api-metadata.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 500Mi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/nova/base/hpa-nova-api-osapi.yaml b/base-kustomize/nova/base/hpa-nova-api-osapi.yaml index db8fa57c..5fb353d1 100644 --- a/base-kustomize/nova/base/hpa-nova-api-osapi.yaml +++ b/base-kustomize/nova/base/hpa-nova-api-osapi.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 500Mi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/nova/base/hpa-nova-conductor.yaml b/base-kustomize/nova/base/hpa-nova-conductor.yaml index 2814335d..3fcca9bc 100644 --- a/base-kustomize/nova/base/hpa-nova-conductor.yaml +++ b/base-kustomize/nova/base/hpa-nova-conductor.yaml @@ -10,9 +10,15 @@ spec: - resource: name: cpu target: - averageUtilization: 50 + averageUtilization: 70 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 500Mi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/nova/base/hpa-nova-novncproxy.yaml b/base-kustomize/nova/base/hpa-nova-novncproxy.yaml index 6742a2e5..dd32315d 100644 --- a/base-kustomize/nova/base/hpa-nova-novncproxy.yaml +++ b/base-kustomize/nova/base/hpa-nova-novncproxy.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 500Mi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/nova/base/hpa-nova-scheduler.yaml b/base-kustomize/nova/base/hpa-nova-scheduler.yaml index bb17791c..65310a35 100644 --- a/base-kustomize/nova/base/hpa-nova-scheduler.yaml +++ b/base-kustomize/nova/base/hpa-nova-scheduler.yaml @@ -10,9 +10,15 @@ spec: - resource: name: cpu target: - averageUtilization: 50 + averageUtilization: 70 type: Utilization type: Resource + - resource: + name: memory + target: + type: AverageValue + averageValue: 1Gi + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/octavia/base/hpa-octavia-api.yaml b/base-kustomize/octavia/base/hpa-octavia-api.yaml index 3fa87357..1b8ee40f 100644 --- a/base-kustomize/octavia/base/hpa-octavia-api.yaml +++ b/base-kustomize/octavia/base/hpa-octavia-api.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + averageValue: 500Mi + type: Value + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/octavia/base/hpa-octavia-worker.yaml b/base-kustomize/octavia/base/hpa-octavia-worker.yaml index b37770e2..b5abd9d0 100644 --- a/base-kustomize/octavia/base/hpa-octavia-worker.yaml +++ b/base-kustomize/octavia/base/hpa-octavia-worker.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + averageValue: 500Mi + type: Value + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/placement/base/hpa-placement-api.yaml b/base-kustomize/placement/base/hpa-placement-api.yaml index 0469134e..c057e220 100644 --- a/base-kustomize/placement/base/hpa-placement-api.yaml +++ b/base-kustomize/placement/base/hpa-placement-api.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + averageValue: 500Mi + type: Value + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment diff --git a/base-kustomize/skyline/base/deployment-apiserver.yaml b/base-kustomize/skyline/base/deployment-apiserver.yaml index a94e0312..2be95c3c 100644 --- a/base-kustomize/skyline/base/deployment-apiserver.yaml +++ b/base-kustomize/skyline/base/deployment-apiserver.yaml @@ -10,7 +10,7 @@ metadata: component: api spec: progressDeadlineSeconds: 600 - replicas: 1 + replicas: 3 revisionHistoryLimit: 3 selector: matchLabels: @@ -108,7 +108,7 @@ spec: memory: "4096Mi" requests: cpu: "0.25" - memory: "64Mi" + memory: "128Mi" command: - bash - -c diff --git a/base-kustomize/skyline/base/hpa-skyline-apiserver.yaml b/base-kustomize/skyline/base/hpa-skyline-apiserver.yaml index e9076dea..efed6277 100644 --- a/base-kustomize/skyline/base/hpa-skyline-apiserver.yaml +++ b/base-kustomize/skyline/base/hpa-skyline-apiserver.yaml @@ -13,6 +13,12 @@ spec: averageUtilization: 50 type: Utilization type: Resource + - resource: + name: memory + target: + averageValue: 500Mi + type: Value + type: Resource scaleTargetRef: apiVersion: apps/v1 kind: Deployment From 69ea6768a59ef7c794edf74450d7e0be4d8f976a Mon Sep 17 00:00:00 2001 From: Chris Breu Date: Fri, 15 Nov 2024 10:36:36 -0600 Subject: [PATCH 5/8] add overlay directory creation to bootstrap.sh (#564) * add overlay directory creation to bootstrap.sh * update docs to reflect ovn-backup directory change * symlink bootstrap.sh * fix typo * trailing whitespace --- .../base}/kustomization.yaml | 0 .../base}/ovn-backup.config | 0 .../base}/ovn-backup.sh | 0 .../base}/ovn-backup.yaml | 0 .../base}/swift-tempauth.env | 0 bootstrap.sh | 71 +++++++++++++++++-- docs/infrastructure-ovn-setup.md | 4 +- 7 files changed, 66 insertions(+), 9 deletions(-) rename base-kustomize/{ovn/ovn-backup => ovn-backup/base}/kustomization.yaml (100%) rename base-kustomize/{ovn/ovn-backup => ovn-backup/base}/ovn-backup.config (100%) rename base-kustomize/{ovn/ovn-backup => ovn-backup/base}/ovn-backup.sh (100%) rename base-kustomize/{ovn/ovn-backup => ovn-backup/base}/ovn-backup.yaml (100%) rename base-kustomize/{ovn/ovn-backup => ovn-backup/base}/swift-tempauth.env (100%) diff --git a/base-kustomize/ovn/ovn-backup/kustomization.yaml b/base-kustomize/ovn-backup/base/kustomization.yaml similarity index 100% rename from base-kustomize/ovn/ovn-backup/kustomization.yaml rename to base-kustomize/ovn-backup/base/kustomization.yaml diff --git a/base-kustomize/ovn/ovn-backup/ovn-backup.config b/base-kustomize/ovn-backup/base/ovn-backup.config similarity index 100% rename from base-kustomize/ovn/ovn-backup/ovn-backup.config rename to base-kustomize/ovn-backup/base/ovn-backup.config diff --git a/base-kustomize/ovn/ovn-backup/ovn-backup.sh b/base-kustomize/ovn-backup/base/ovn-backup.sh similarity index 100% rename from base-kustomize/ovn/ovn-backup/ovn-backup.sh rename to base-kustomize/ovn-backup/base/ovn-backup.sh diff --git a/base-kustomize/ovn/ovn-backup/ovn-backup.yaml b/base-kustomize/ovn-backup/base/ovn-backup.yaml similarity index 100% rename from base-kustomize/ovn/ovn-backup/ovn-backup.yaml rename to base-kustomize/ovn-backup/base/ovn-backup.yaml diff --git a/base-kustomize/ovn/ovn-backup/swift-tempauth.env b/base-kustomize/ovn-backup/base/swift-tempauth.env similarity index 100% rename from base-kustomize/ovn/ovn-backup/swift-tempauth.env rename to base-kustomize/ovn-backup/base/swift-tempauth.env diff --git a/bootstrap.sh b/bootstrap.sh index 7049e01d..77c89d2f 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -76,13 +76,70 @@ message "Deploy Mulinode: ${OSH_DEPLOY_MULTINODE}" # Ensure /etc/genestack exists mkdir -p /etc/genestack -# Copy base-kustomize if it does not already exist -if [ ! -d "/etc/genestack/kustomize" ]; then - cp -r /opt/genestack/base-kustomize /etc/genestack/kustomize - success "Copied kustomize to /etc/genestack/" -else - message "kustomize already exists in /etc/genestack, skipping copy." -fi +# Ensure each service from /opt/genestack/base-kustomize +# exists in /etc/genestack/kustomize and symlink +# base and aio. +base_source_dir="/opt/genestack/base-kustomize" +base_target_dir="/etc/genestack/kustomize" + +for service in "$base_source_dir"/*; do + service_name=$(basename "$service") + if [ -d "$service" ] && [ -d "$service/base" ]; then + if [ -d "$base_target_dir/$service_name" ]; then + message "$base_target_dir/$service_name already exists" + else + message "Creating $base_target_dir/$service_name" + mkdir -p "$base_target_dir/$service_name" + fi + if [ ! -L "$base_target_dir/$service_name/base" ]; then + ln -s "$service/base" "$base_target_dir/$service_name/base" + success "Created symlink for $service_name/base" + fi + else + message "No base folder for $service_name, skipping..." + fi + if [ -d "$service" ] && [ -d "$service/aio" ]; then + if [ ! -L "$base_target_dir/$service_name/aio" ]; then + ln -s "$service/aio" "$base_target_dir/$service_name/aio" + success "Created symlink for $service_name/aio" + fi + else + message "No aio folder for $service_name, skipping..." + fi +done + +# Symlink /opt/genestack/kustomize.sh to +# /etc/genestack/kustomize/kustomize.sh +ln -s $base_source_dir/base-kustomize/kustomize.sh $base_target_dir/kustomize/kustomize.sh + +# Ensure kustomization.yaml exists in each +# service base/overlay directory +# Directory paths +overlay_target_dir="/etc/genestack/kustomize" + +kustomization_content="apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - ../base +" + +for service in "$overlay_target_dir"/*; do + if [ -d "$service" ]; then + overlay_path="${service}/overlay" + + if [ ! -d "$overlay_path" ]; then + mkdir -p "$overlay_path" + success "Creating overlay path $overlay_path" + fi + + if [ ! -f "$overlay_path/kustomization.yaml" ]; then + echo "$kustomization_content" > "$overlay_path/kustomization.yaml" + success "Created overlay and kustomization.yaml for $(basename "$service")" + else + message "kustomization.yaml already exists for $(basename "$service"), skipping..." + fi + fi +done # Copy base-helm-configs if it does not already exist if [ ! -d "/etc/genestack/helm-configs" ]; then diff --git a/docs/infrastructure-ovn-setup.md b/docs/infrastructure-ovn-setup.md index 14255051..f5d63b22 100644 --- a/docs/infrastructure-ovn-setup.md +++ b/docs/infrastructure-ovn-setup.md @@ -126,14 +126,14 @@ If there's ever a need to reconfigure a node, simply remove the label and the Da !!! tip "Setup your OVN backup" To upload backups to Swift with tempauth, edit - /etc/genestack/kustomize/ovn/ovn-backup/ovn-backup.config to set + /etc/genestack/kustomize/ovn-backup/ovn-backup.config to set `SWIFT_TEMPAUTH_UPLOAD' "true"`, edit the other related options appropriately (i.e., set the CONTAINER) and fill the ST_AUTH, ST_USER, and ST_KEY as appropriate for the Swift CLI client in the `swift-tempauth.env` file and then run: ``` shell - kubectl apply -k /etc/genestack/kustomize/ovn/ovn-backup \ + kubectl apply -k /etc/genestack/kustomize/ovn-backup \ --prune -l app=ovn-backup \ --prune-allowlist=core/v1/Secret \ --prune-allowlist=core/v1/ConfigMap From 215f0bb96ade46b27499a84974ed3755c8f19877 Mon Sep 17 00:00:00 2001 From: Luke Repko Date: Fri, 15 Nov 2024 12:51:43 -0600 Subject: [PATCH 6/8] fix: correct miscellaneous typos (#569) * fix: True up grafana installation While re-deploying one of our environments, these small changes were identified and are being backported to upstream for the grafana install. * fix: update heat image urls for octavia --- .../octavia/octavia-helm-overrides.yaml | 14 +++++------ .../grafana/base/azure-client-secret.yaml | 6 ++--- base-kustomize/grafana/base/datasources.yaml | 4 ++-- .../grafana/base/grafana-values.yaml | 24 ++++++++++--------- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/base-helm-configs/octavia/octavia-helm-overrides.yaml b/base-helm-configs/octavia/octavia-helm-overrides.yaml index e1051892..8bb31db0 100644 --- a/base-helm-configs/octavia/octavia-helm-overrides.yaml +++ b/base-helm-configs/octavia/octavia-helm-overrides.yaml @@ -21,13 +21,13 @@ labels: images: tags: test: "quay.io/rackspace/rackerlabs-xrally-openstack:2.0.0" - bootstrap: "quay.rackspace.com/rackerlabs-heat:2024.1-ubuntu_jammy" - db_init: "quay.rackspace.com/rackerlabs-heat:2024.1-ubuntu_jammy" - db_drop: "quay.rackspace.com/rackerlabs-heat:2024.1-ubuntu_jammy" + bootstrap: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + db_init: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + db_drop: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" rabbit_init: "quay.io/rackspace/rackerlabs-rabbitmq:3.13-management" - ks_user: "quay.rackspace.com/rackerlabs-heat:2024.1-ubuntu_jammy" - ks_service: "quay.rackspace.com/rackerlabs-heat:2024.1-ubuntu_jammy" - ks_endpoints: "quay.rackspace.com/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_user: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_service: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_endpoints: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" dep_check: "quay.io/rackspace/rackerlabs-kubernetes-entrypoint:v1.0.0" image_repo_sync: "quay.io/rackspace/rackerlabs-docker:17.07.0" octavia_db_sync: "quay.io/rackspace/rackerlabs-octavia-ovn:master-ubuntu_jammy" @@ -35,7 +35,7 @@ images: octavia_worker: "quay.io/rackspace/rackerlabs-octavia-ovn:master-ubuntu_jammy" octavia_housekeeping: "quay.io/rackspace/rackerlabs-octavia-ovn:master-ubuntu_jammy" octavia_health_manager: "quay.io/rackspace/rackerlabs-octavia-ovn:master-ubuntu_jammy" - octavia_health_manager_init: "quay.rackspace.com/rackerlabs-heat:2024.1-ubuntu_jammy" + octavia_health_manager_init: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" openvswitch_vswitchd: docker.io/kolla/centos-source-openvswitch-vswitchd:rocky pull_policy: "IfNotPresent" local_registry: diff --git a/base-kustomize/grafana/base/azure-client-secret.yaml b/base-kustomize/grafana/base/azure-client-secret.yaml index e707a00c..a8bc2900 100644 --- a/base-kustomize/grafana/base/azure-client-secret.yaml +++ b/base-kustomize/grafana/base/azure-client-secret.yaml @@ -1,9 +1,9 @@ -apiversion: v1 +apiVersion: v1 data: client_id: base64_encoded_client_id client_secret: base64_encoded_client_secret -kind: secret +kind: Secret metadata: name: azure-client namespace: grafana -type: opaque +type: Opaque diff --git a/base-kustomize/grafana/base/datasources.yaml b/base-kustomize/grafana/base/datasources.yaml index 6ae7e3a3..372ae87f 100644 --- a/base-kustomize/grafana/base/datasources.yaml +++ b/base-kustomize/grafana/base/datasources.yaml @@ -2,12 +2,12 @@ datasources: datasources.yaml: apiversion: 1 datasources: - - name: prometheus + - name: Prometheus type: prometheus access: proxy url: http://kube-prometheus-stack-prometheus.prometheus.svc.cluster.local:9090 isdefault: true - - name: loki + - name: Loki type: loki access: proxy url: http://loki-gateway.{{ $.Release.Namespace }}.svc.cluster.local:80 diff --git a/base-kustomize/grafana/base/grafana-values.yaml b/base-kustomize/grafana/base/grafana-values.yaml index e78b6a74..53ff7621 100644 --- a/base-kustomize/grafana/base/grafana-values.yaml +++ b/base-kustomize/grafana/base/grafana-values.yaml @@ -5,18 +5,9 @@ tenant_id: 122333 # TODO: update this value to use your Azure Tenant ID ingress: enabled: false - annotations: - nginx.ingress.kubernetes.io/rewrite-target: / - path: / - pathType: ImplementationSpecific - - hosts: - - "{{ .Values.custom_host }}" # Ref: custom_host variable above - tls: - - hosts: - - "{{ .Values.custom_host }}" # Ref: custom_host variable above - secretName: grafana-tls-public +image: + tag: "10.3.3" extraSecretMounts: - name: azure-client-secret-mount @@ -24,6 +15,11 @@ extraSecretMounts: defaultMode: 0440 mountPath: /etc/secrets/azure-client readOnly: true + - name: grafana-db-secret-mount + secretName: grafana-db + defaultMode: 0440 + mountPath: /etc/secrets/grafana-db + readOnly: true nodeSelector: openstack-control-plane: enabled grafana.ini: @@ -56,3 +52,9 @@ grafana.ini: allow_assign_grafana_admin: false skip_org_role_sync: false use_pkce: true + database: + type: mysql + host: mariadb-cluster-primary.openstack.svc:3306 + user: $__file{/etc/secrets/grafana-db/username} + password: $__file{/etc/secrets/grafana-db/password} + name: grafana From 027771ef791f04bfb3e2f418d9f7eba7760dc029 Mon Sep 17 00:00:00 2001 From: "phillip.toohill" Date: Fri, 15 Nov 2024 12:55:57 -0600 Subject: [PATCH 7/8] Adding alerting info operation doc (#563) --- docs/alerting-info.md | 82 ++++++++++++++++++ docs/alertmanager-msteams.md | 54 ++++++++++++ docs/alertmanager-pagerduty.md | 55 ++++++++++++ .../assets/images/prometheus-architecture.png | Bin 0 -> 96834 bytes mkdocs.yml | 3 + 5 files changed, 194 insertions(+) create mode 100644 docs/alerting-info.md create mode 100644 docs/alertmanager-msteams.md create mode 100644 docs/alertmanager-pagerduty.md create mode 100644 docs/assets/images/prometheus-architecture.png diff --git a/docs/alerting-info.md b/docs/alerting-info.md new file mode 100644 index 00000000..d783b52c --- /dev/null +++ b/docs/alerting-info.md @@ -0,0 +1,82 @@ +# Genestack Alerting + +Genestack is made up of a vast array of components working away to provide a Kubernetes and OpenStack cloud infrastructure +to serve our needs. Here we'll discuss in a bit more detail about how we configure and make use of our alerting mechanisms +to maintain the health of our systems. + +## Overview + +In this document we'll dive a bit deeper into the alerting components and how they're configured and used to maintain the health of our genestack. +Please take a look at the [Monitoring Information Doc](monitoring-info.md) for more information regarding how the metrics and stats are collected in order to make use of our alerting mechanisms. + + +## Prometheus Alerting + +As noted in the [Monitoring Information Doc](monitoring-info.md) we make heavy use of [Prometheus](https://prometheus.io) and within the Genestack workflow specifically we deploy the [kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) which handles deployment of the Prometheus servers, operators, alertmanager and various other components. +Genestack uses Prometheus for metrics and stats collection and overall monitoring of its systems that are described in the [Monitoring Information Doc](monitoring-info.md). +With the metrics and stats collected we can now use Prometheus to generate alerts based on those metrics and stats using the Prometheus [Alerting Rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/). +The Prometheus alerting rules allows us to define conditions we want to escalate using the [Prometheus expression language](https://prometheus.io/docs/prometheus/latest/querying/basics/) which can be visualized and sent to an external notification systems for further action. + +A simple example of an alerting rule would be this RabbitQueueSizeTooLarge +!!! example "RabbitQueueSizeTooLarge Alerting Rule Example" + + ``` yaml + rabbitmq-alerts: + groups: + - name: Prometheus Alerts + rules: + - alert: RabbitQueueSizeTooLarge + expr: rabbitmq_queuesTotal>25 + for: 5m + labels: + severity: critical + annotations: + summary: "Rabbit queue size too large (instance {{ `{{ $labels.instance }}` }} )" + ``` + +In Genestack we have separated the alerting rules config out from the primary helm configuration using the `additionalPrometheusRulesMap` directive to make it a bit easier to maintain. +Doing it this way allows for easier review of new rules, better maintainability, easier updates of the stack and helps with portability for larger deployments. Keeping our configurations separated and checked in to the repo in such a manner is ideal for these reasons. +The alternative is to create the rules within your observability platform, in Genestack's default workflow this would be Grafana. Although the end user is free to make such a choice you end up losing a lot of the benefits we just mentioned while creating additional headaches when deploying to new clusters or even during basic updates. + +You can view the rest of the default alerting rule configurations in the Genestack repo [alerting rules](https://github.com/rackerlabs/genestack/blob/main/base-helm-configs/prometheus/alerting_rules.yaml) yaml file. + +To deploy any new rules you would simply run the [Prometheus Deployment](prometheus.md) and Helm/Prometheus will take care of updating the configurations from there. +!!! example "Run the Prometheus deployment Script `bin/install-prometheus.sh`" + + ``` shell + --8<-- "bin/install-prometheus.sh" + ``` + + +## Alert Manager + +The kube-prometheus-stack not only contains our monitoring components such as Prometheus and related CRD's, but it also contains another important features, the [Alert Manager](https://prometheus.io/docs/alerting/latest/alertmanager/). +The Alert Manager is a crucial component in the alerting pipeline as it takes care of grouping, deduplicating and even routing the alerts to the correct receiver integrations. +Prometheus is responsible for generating the alerts based on the [Alerting Rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/) we [defined](https://github.com/rackerlabs/genestack/blob/main/base-helm-configs/prometheus/alerting_rules.yaml). +Prometheus then sends these alerts to the [Alert Manager](https://prometheus.io/docs/alerting/latest/alertmanager/) for further processing. + +The below diagram gives a better idea of how the Alert Manager works with Prometheus as a whole. +![Prometheus Architecture](assets/images/prometheus-architecture.png) + +Genestack provides a basic [alertmanager_config](https://github.com/rackerlabs/genestack/blob/main/base-helm-configs/prometheus/alertmanager_config.yaml) that's separated out from the primary Prometheus configurations for similar reasons the [alerting rules](https://github.com/rackerlabs/genestack/blob/main/base-helm-configs/prometheus/alerting_rules.yaml) are. +Here we can see the key components of the Alert Manager config that allows us to group and send our alerts to external services for further action. + + * [Inhibit Rules](https://prometheus.io/docs/alerting/latest/configuration/#inhibition-related-settings) + Inhibition rules allows us to establish dependencies between systems or services so that only the most relevant set of alerts are sent out during an outage + * [Routes](https://prometheus.io/docs/alerting/latest/configuration/#route-related-settings) + Routing-related settings allow configuring how alerts are routed, aggregated, throttled, and muted based on time. + * [Receivers](https://prometheus.io/docs/alerting/latest/configuration/#general-receiver-related-settings) + Receiver settings allow configuring notification destinations for our alerts. + +These are all explained in greater detail in the [Alert Manager Docs](https://prometheus.io/docs/alerting/latest/configuration/#configuration). + +The Alert Manager has various baked-in methods to allow those notifications to be sent to services like [email](https://prometheus.io/docs/alerting/latest/configuration/#email_config), [PagerDuty](https://prometheus.io/docs/alerting/latest/configuration/#pagerduty_config) and [Microsoft Teams](https://prometheus.io/docs/alerting/latest/configuration/#msteams_config). +For a full list and further information view the [receiver information documentation](https://prometheus.io/docs/alerting/latest/configuration/#receiver-integration-settings). + +The following list contains a few examples of these receivers as part of the [alertmanager_config](https://github.com/rackerlabs/genestack/blob/main/base-helm-configs/prometheus/alertmanager_config.yaml) found in Genestack. + +* [Slack Receiver](alertmanager-slack.md) +* [PagerDuty Receiver](alertmanager-pagerduty.md) +* [Microsoft Teams Receiver](alertmanager-msteams.md) + +We can now take all this information and build out an alerting workflow that suits our needs! diff --git a/docs/alertmanager-msteams.md b/docs/alertmanager-msteams.md new file mode 100644 index 00000000..4b41fb2c --- /dev/null +++ b/docs/alertmanager-msteams.md @@ -0,0 +1,54 @@ +# Microsoft Teams Alerts + +The following example describes configuration options to send alerts via alertmanager to Microsoft Teams. + +``` yaml +alertmanager: + + ## Alertmanager configuration directives + ## ref: https://prometheus.io/docs/alerting/configuration/#configuration-file + ## https://prometheus.io/webtools/alerting/routing-tree-editor/ + ## + config: + global: + resolve_timeout: 5m + inhibit_rules: + - source_matchers: + - 'severity = critical' + target_matchers: + - 'severity =~ warning|info' + equal: + - 'namespace' + - 'alertname' + - source_matchers: + - 'severity = warning' + target_matchers: + - 'severity = info' + equal: + - 'namespace' + - 'alertname' + - source_matchers: + - 'alertname = InfoInhibitor' + target_matchers: + - 'severity = info' + equal: + - 'namespace' + - target_matchers: + - 'alertname = InfoInhibitor' + route: + group_by: ['namespace'] + group_wait: 30s + group_interval: 5m + repeat_interval: 12h + receiver: msteams_config + routes: + - receiver: 'null' + matchers: + - alertname = "Watchdog" + receivers: + - name: 'null' + - name: 'msteams_config' + msteams_configs: + - send_resolved: true + webhook_url: https://msteams.webhook_url.example +``` diff --git a/docs/alertmanager-pagerduty.md b/docs/alertmanager-pagerduty.md new file mode 100644 index 00000000..f9782516 --- /dev/null +++ b/docs/alertmanager-pagerduty.md @@ -0,0 +1,55 @@ +# PagerDuty Alerts + +The following example describes configuration options to send alerts via alertmanager to PagerDuty. + +``` yaml +alertmanager: + + ## Alertmanager configuration directives + ## ref: https://prometheus.io/docs/alerting/configuration/#configuration-file + ## https://prometheus.io/webtools/alerting/routing-tree-editor/ + ## + config: + global: + resolve_timeout: 5m + pagerduty_url: 'https://events.pagerduty.com/v2/enqueue' + inhibit_rules: + - source_matchers: + - 'severity = critical' + target_matchers: + - 'severity =~ warning|info' + equal: + - 'namespace' + - 'alertname' + - source_matchers: + - 'severity = warning' + target_matchers: + - 'severity = info' + equal: + - 'namespace' + - 'alertname' + - source_matchers: + - 'alertname = InfoInhibitor' + target_matchers: + - 'severity = info' + equal: + - 'namespace' + - target_matchers: + - 'alertname = InfoInhibitor' + route: + group_by: ['namespace'] + group_wait: 30s + group_interval: 5m + repeat_interval: 12h + receiver: 'pagerduty-notifications' + routes: + - receiver: 'null' + matchers: + - alertname = "Watchdog" + receivers: + - name: 'null' + - name: 'pagerduty-notifications' + pagerduty_configs: + - service_key: 0c1cc665a594419b6d215e81f4e38f7 + send_resolved: true +``` diff --git a/docs/assets/images/prometheus-architecture.png b/docs/assets/images/prometheus-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..1610bc02435fafceadb979baffceb026ed17b2f0 GIT binary patch literal 96834 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 Date: Fri, 15 Nov 2024 12:56:28 -0600 Subject: [PATCH 8/8] doc: Fix Prometheus post-checking command in docs to match release name (#567) release name went from prometheus to kube-prometheus stack here: https://github.com/rackerlabs/genestack/commit/a468178df47062aa2a9d5367e44cabbbdf3d2db5 --- docs/prometheus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/prometheus.md b/docs/prometheus.md index d5946695..32cf7052 100644 --- a/docs/prometheus.md +++ b/docs/prometheus.md @@ -26,7 +26,7 @@ information, take a look at [Prometheus Kube Stack](https://github.com/prometheu If the installation is successful, you should see the related exporter pods in the prometheus namespace. ``` shell - kubectl -n prometheus get pods -l "release=prometheus" + kubectl -n prometheus get pods -l "release=kube-prometheus-stack" ``` ## Update Alertmanager Configuration