Skip to content

Commit ae4aa0d

Browse files
authored
alertmanager: Generate prod resources (#727)
1 parent af4d168 commit ae4aa0d

File tree

4 files changed

+364
-13
lines changed

4 files changed

+364
-13
lines changed

magefiles/alertmanager.go

+36-11
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/observatorium/observatorium/configuration_go/kubegen/workload"
1212
routev1 "github.com/openshift/api/route/v1"
1313
templatev1 "github.com/openshift/api/template/v1"
14+
"github.com/philipgough/mimic"
1415
"github.com/philipgough/mimic/encoding"
1516
monv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
1617
"github.com/rhobs/configuration/services_go/observatorium"
@@ -64,20 +65,44 @@ func (s Stage) Alertmanager() {
6465
memoryLimit: memLimit,
6566
},
6667
})
67-
manifests := k8s.Objects()
68-
var sm *monv1.ServiceMonitor
69-
sm, manifests = getAndRemoveObject[*monv1.ServiceMonitor](manifests, "")
70-
smEnc := postProcessServiceMonitor(sm, s.namespace())
71-
enc := alertmanagerPostProcess(manifests, s.namespace())
72-
gen.Add(alertmanagerTemplate, enc)
73-
gen.Add(serviceMonitorTemplate, smEnc)
74-
gen.Generate()
75-
68+
buildAlertmanager(k8s.Objects(), s.namespace(), gen)
7669
}
7770

7871
// Alertmanager Generates the Alertmanager configuration for the production environment.
79-
func (Production) Alertmanager() {
80-
// todo
72+
func (p Production) Alertmanager() {
73+
gen := p.generator(alertManagerName)
74+
75+
const (
76+
alertManagerImageTag = defaultAlertManagerImageTag
77+
78+
cpuRequest = defaultAlertmanagerCPURequest
79+
cpuLimit = defaultAlertmanagerCPULimit
80+
memRequest = defaultAlertmanagerMemoryRequest
81+
memLimit = defaultAlertmanagerMemoryLimit
82+
)
83+
84+
k8s := alertmanagerKubernetes(alertManagerOptions(), manifestOptions{
85+
namespace: p.namespace(),
86+
image: defaultAlertManagerImage,
87+
imageTag: alertManagerImageTag,
88+
resourceRequirements: resourceRequirements{
89+
cpuRequest: cpuRequest,
90+
cpuLimit: cpuLimit,
91+
memoryRequest: memRequest,
92+
memoryLimit: memLimit,
93+
},
94+
})
95+
buildAlertmanager(k8s.Objects(), p.namespace(), gen)
96+
}
97+
98+
func buildAlertmanager(manifests []runtime.Object, namespace string, generator *mimic.Generator) {
99+
var sm *monv1.ServiceMonitor
100+
sm, manifests = getAndRemoveObject[*monv1.ServiceMonitor](manifests, "")
101+
smEnc := postProcessServiceMonitor(sm, namespace)
102+
enc := alertmanagerPostProcess(manifests, namespace)
103+
generator.Add(alertmanagerTemplate, enc)
104+
generator.Add(serviceMonitorTemplate, smEnc)
105+
generator.Generate()
81106
}
82107

83108
func alertManagerOptions() *alertmanager.AlertManagerOptions {

magefiles/magefile.go

+16-2
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,27 @@ func (Stage) generator(component string) *mimic.Generator {
9090
return gen
9191
}
9292

93-
const stageNamespace = "rhobs-stage"
93+
func (Production) generator(component string) *mimic.Generator {
94+
gen := &mimic.Generator{}
95+
gen = gen.With(templatePath, templateServicesPath, component, "production")
96+
gen.Logger = log.NewLogfmtLogger(log.NewSyncWriter(os.Stdout))
97+
return gen
98+
}
99+
100+
const (
101+
stageNamespace = "rhobs-stage"
102+
prodNamespace = "rhobs-production"
103+
)
94104

95105
func (Stage) namespace() string {
96106
return stageNamespace
97107
}
98108

109+
func (Production) namespace() string {
110+
return prodNamespace
111+
}
112+
99113
// Build Builds the manifests for the production environment.
100114
func (Production) Build() {
101-
// todo
115+
mg.Deps(Production.Alertmanager)
102116
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,275 @@
1+
apiVersion: template.openshift.io/v1
2+
kind: Template
3+
metadata:
4+
creationTimestamp: null
5+
name: alertmanager
6+
objects:
7+
- apiVersion: v1
8+
kind: Service
9+
metadata:
10+
creationTimestamp: null
11+
labels:
12+
app.kubernetes.io/component: alertmanager
13+
app.kubernetes.io/instance: observatorium
14+
app.kubernetes.io/name: alertmanager
15+
app.kubernetes.io/part-of: observatorium
16+
name: alertmanager-cluster
17+
namespace: rhobs-production
18+
spec:
19+
clusterIP: None
20+
ports:
21+
- name: cluster-tcp
22+
port: 9094
23+
protocol: TCP
24+
targetPort: 9094
25+
selector:
26+
app.kubernetes.io/component: alertmanager
27+
app.kubernetes.io/instance: observatorium
28+
app.kubernetes.io/name: alertmanager
29+
app.kubernetes.io/part-of: observatorium
30+
status:
31+
loadBalancer: {}
32+
- apiVersion: route.openshift.io/v1
33+
kind: Route
34+
metadata:
35+
annotations:
36+
cert-manager.io/issuer-kind: ClusterIssuer
37+
cert-manager.io/issuer-name: letsencrypt-prod-http
38+
creationTimestamp: null
39+
labels:
40+
app.kubernetes.io/component: alertmanager
41+
app.kubernetes.io/instance: observatorium
42+
app.kubernetes.io/name: alertmanager
43+
app.kubernetes.io/part-of: observatorium
44+
app.kubernetes.io/version: v4.15
45+
name: alertmanager
46+
namespace: rhobs-production
47+
spec:
48+
host: ""
49+
port:
50+
targetPort: https
51+
tls:
52+
insecureEdgeTerminationPolicy: Redirect
53+
termination: reencrypt
54+
to:
55+
kind: Service
56+
name: alertmanager
57+
weight: null
58+
status:
59+
ingress: null
60+
- apiVersion: v1
61+
kind: Service
62+
metadata:
63+
annotations:
64+
service.alpha.openshift.io/serving-cert-secret-name: alertmanager-tls
65+
creationTimestamp: null
66+
labels:
67+
app.kubernetes.io/component: alertmanager
68+
app.kubernetes.io/instance: observatorium
69+
app.kubernetes.io/name: alertmanager
70+
app.kubernetes.io/part-of: observatorium
71+
name: alertmanager
72+
namespace: rhobs-production
73+
spec:
74+
ports:
75+
- name: http
76+
port: 9093
77+
protocol: TCP
78+
targetPort: 9093
79+
- name: https
80+
port: 8443
81+
targetPort: 8443
82+
selector:
83+
app.kubernetes.io/component: alertmanager
84+
app.kubernetes.io/instance: observatorium
85+
app.kubernetes.io/name: alertmanager
86+
app.kubernetes.io/part-of: observatorium
87+
status:
88+
loadBalancer: {}
89+
- apiVersion: v1
90+
kind: ServiceAccount
91+
metadata:
92+
annotations:
93+
serviceaccounts.openshift.io/oauth-redirectreference.application: '{"kind":"OAuthRedirectReference","apiVersion":"v1","reference":{"kind":"Route","name":"alertmanager"}}'
94+
creationTimestamp: null
95+
labels:
96+
app.kubernetes.io/component: alertmanager
97+
app.kubernetes.io/instance: observatorium
98+
app.kubernetes.io/name: alertmanager
99+
app.kubernetes.io/part-of: observatorium
100+
name: alertmanager
101+
namespace: rhobs-production
102+
- apiVersion: apps/v1
103+
kind: StatefulSet
104+
metadata:
105+
creationTimestamp: null
106+
labels:
107+
app.kubernetes.io/component: alertmanager
108+
app.kubernetes.io/instance: observatorium
109+
app.kubernetes.io/name: alertmanager
110+
app.kubernetes.io/part-of: observatorium
111+
app.kubernetes.io/version: v4.15
112+
name: alertmanager
113+
namespace: rhobs-production
114+
spec:
115+
replicas: ${{ALERTMANAGER_REPLICAS}}
116+
selector:
117+
matchLabels:
118+
app.kubernetes.io/component: alertmanager
119+
app.kubernetes.io/instance: observatorium
120+
app.kubernetes.io/name: alertmanager
121+
app.kubernetes.io/part-of: observatorium
122+
serviceName: alertmanager-cluster
123+
template:
124+
metadata:
125+
creationTimestamp: null
126+
labels:
127+
app.kubernetes.io/component: alertmanager
128+
app.kubernetes.io/instance: observatorium
129+
app.kubernetes.io/name: alertmanager
130+
app.kubernetes.io/part-of: observatorium
131+
app.kubernetes.io/version: v4.15
132+
namespace: rhobs-production
133+
spec:
134+
affinity:
135+
podAntiAffinity:
136+
preferredDuringSchedulingIgnoredDuringExecution:
137+
- podAffinityTerm:
138+
labelSelector:
139+
matchExpressions:
140+
- key: app.kubernetes.io/instance
141+
operator: In
142+
values:
143+
- observatorium
144+
- key: app.kubernetes.io/name
145+
operator: In
146+
values:
147+
- alertmanager
148+
topologyKey: kubernetes.io/hostname
149+
weight: 100
150+
containers:
151+
- args:
152+
- --config.file=/etc/alertmanager/config/alertmanager.yaml
153+
- --storage.path=/data
154+
- --cluster.peer=alertmanager-0.alertmanager-cluster.rhobs-production.svc.cluster.local:9094
155+
- --cluster.peer=alertmanager-1.alertmanager-cluster.rhobs-production.svc.cluster.local:9094
156+
- --cluster.reconnect-timeout=5m0s
157+
- --log.level=${ALERTMANAGER_LOG_LEVEL}
158+
- --log.format=logfmt
159+
image: registry.redhat.io/openshift4/ose-prometheus-alertmanager:v4.15
160+
imagePullPolicy: IfNotPresent
161+
livenessProbe:
162+
failureThreshold: 8
163+
httpGet:
164+
path: /-/healthy
165+
port: 9093
166+
periodSeconds: 30
167+
timeoutSeconds: 1
168+
name: alertmanager
169+
ports:
170+
- containerPort: 9093
171+
name: http
172+
protocol: TCP
173+
- containerPort: 9094
174+
name: cluster-tcp
175+
protocol: TCP
176+
readinessProbe:
177+
failureThreshold: 20
178+
httpGet:
179+
path: /-/ready
180+
port: 9093
181+
periodSeconds: 5
182+
resources:
183+
limits:
184+
cpu: "5"
185+
memory: ${ALERTMANAGER_MEMORY_LIMIT}
186+
requests:
187+
cpu: ${ALERTMANAGER_CPU_REQUEST}
188+
memory: ${ALERTMANAGER_MEMORY_REQUEST}
189+
terminationMessagePolicy: FallbackToLogsOnError
190+
volumeMounts:
191+
- mountPath: /data
192+
name: alertmanager-data
193+
- mountPath: /etc/alertmanager/config
194+
name: config-file
195+
readOnly: true
196+
- args:
197+
- -provider=openshift
198+
- -https-address=:8443
199+
- -http-address=
200+
- -email-domain=*
201+
- -upstream=http://localhost:9093
202+
- -openshift-service-account=alertmanager
203+
- '-openshift-sar={"resource": "namespaces", "verb": "get", "name": "rhobs-production",
204+
"namespace": "rhobs-production"}'
205+
- '-openshift-delegate-urls={"/": {"resource": "namespaces", "verb": "get",
206+
"name": "rhobs-production", "namespace": "rhobs-production"}}'
207+
- -tls-cert=/etc/tls/private/tls.crt
208+
- -tls-key=/etc/tls/private/tls.key
209+
- -client-secret-file=/var/run/secrets/kubernetes.io/serviceaccount/token
210+
- -cookie-secret=${OAUTH_PROXY_COOKIE_SECRET}
211+
- -openshift-ca=/etc/pki/tls/cert.pem
212+
- -openshift-ca=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
213+
image: registry.redhat.io/openshift4/ose-oauth-proxy:v4.14
214+
name: oauth-proxy
215+
ports:
216+
- containerPort: 8443
217+
name: https
218+
protocol: TCP
219+
resources:
220+
requests:
221+
cpu: 100m
222+
memory: 100Mi
223+
terminationMessagePolicy: FallbackToLogsOnError
224+
volumeMounts:
225+
- mountPath: /etc/tls/private
226+
name: tls
227+
readOnly: true
228+
nodeSelector:
229+
kubernetes.io/os: linux
230+
serviceAccountName: alertmanager
231+
terminationGracePeriodSeconds: 120
232+
volumes:
233+
- name: config-file
234+
secret:
235+
secretName: alertmanager-config
236+
- name: tls
237+
secret:
238+
secretName: alertmanager-tls
239+
updateStrategy: {}
240+
volumeClaimTemplates:
241+
- metadata:
242+
creationTimestamp: null
243+
labels:
244+
app.kubernetes.io/component: alertmanager
245+
app.kubernetes.io/instance: observatorium
246+
app.kubernetes.io/name: alertmanager
247+
app.kubernetes.io/part-of: observatorium
248+
app.kubernetes.io/version: v4.15
249+
name: alertmanager-data
250+
namespace: rhobs-production
251+
spec:
252+
accessModes:
253+
- ReadWriteOnce
254+
resources:
255+
requests:
256+
storage: 1Gi
257+
storageClassName: gp2
258+
status: {}
259+
status:
260+
availableReplicas: 0
261+
replicas: 0
262+
parameters:
263+
- name: ALERTMANAGER_CPU_REQUEST
264+
value: 100m
265+
- name: ALERTMANAGER_LOG_LEVEL
266+
value: warn
267+
- name: ALERTMANAGER_MEMORY_LIMIT
268+
value: 5Gi
269+
- name: ALERTMANAGER_MEMORY_REQUEST
270+
value: 256Mi
271+
- name: ALERTMANAGER_REPLICAS
272+
value: "2"
273+
- from: '[a-zA-Z0-9]{40}'
274+
generate: expression
275+
name: OAUTH_PROXY_COOKIE_SECRET

0 commit comments

Comments
 (0)