Skip to content

Commit 95dfe0d

Browse files
authored
Merge pull request kcl-lang#54 from howieyuen/install
feat: one-click deploy alertmanager integrating with prometheus
2 parents e87b3df + 060e7c7 commit 95dfe0d

File tree

8 files changed

+396
-1
lines changed

8 files changed

+396
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import base.pkg.kusion_models.kube.frontend.rbac
2+
import base.pkg.kusion_kubernetes.api.core.v1 as corev1
3+
4+
5+
_rbac_name = "prometheus"
6+
_common_namespace = "default"
7+
8+
# 1. create a service account
9+
_prometheus_sa: corev1.ServiceAccount {
10+
metadata = {
11+
name = _rbac_name
12+
namespace = _common_namespace
13+
}
14+
}
15+
16+
# 2. prepare required permissions with api groups and resources
17+
_prometheus_clusterrole: rbac.ClusterRole {
18+
metadata = {
19+
name = _rbac_name
20+
namespace = _common_namespace
21+
}
22+
rules = [
23+
{
24+
apiGroups = [""]
25+
resources = ["nodes", "nodes/metrics", "services", "endpoints", "pods"]
26+
verbs = ["get", "list", "watch"]
27+
}
28+
{
29+
apiGroups = [""]
30+
resources = ["configmaps"]
31+
verbs = ["get"]
32+
}
33+
{
34+
apiGroups = ["networking.k8s.io"]
35+
resources = ["ingresses"]
36+
verbs = ["get", "list", "watch"]
37+
}
38+
{
39+
nonResourceURLs = ["/metrics"]
40+
verbs = ["get"]
41+
}
42+
]
43+
}
44+
45+
# 3. bind service account and cluster role
46+
rbac.ClusterRoleBinding{
47+
metadata = {
48+
name = _rbac_name
49+
namespace = _common_namespace
50+
}
51+
roleRef = {
52+
apiGroup = "rbac.authorization.k8s.io"
53+
kind = "ClusterRole"
54+
name = _prometheus_clusterrole.metadata.name
55+
}
56+
subjects = [
57+
{
58+
kind = "ServiceAccount"
59+
name = _prometheus_sa.metadata.name
60+
namespace = _prometheus_sa.metadata.namespace
61+
}
62+
]
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
kcl_options:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
id: rbac.authorization.k8s.io/v1:ClusterRoleBinding:default:prometheus
2+
type: Kubernetes
3+
dependsOn:
4+
- rbac.authorization.k8s.io/v1:ClusterRole:default:prometheus
5+
attributes:
6+
apiVersion: rbac.authorization.k8s.io/v1
7+
kind: ClusterRoleBinding
8+
subjects:
9+
- kind: ServiceAccount
10+
name: prometheus
11+
namespace: default
12+
metadata:
13+
name: prometheus
14+
namespace: default
15+
roleRef:
16+
apiGroup: rbac.authorization.k8s.io
17+
kind: ClusterRole
18+
name: prometheus
19+
---
20+
id: rbac.authorization.k8s.io/v1:ClusterRole:default:prometheus
21+
type: Kubernetes
22+
attributes:
23+
apiVersion: rbac.authorization.k8s.io/v1
24+
kind: ClusterRole
25+
rules:
26+
- apiGroups:
27+
- ''
28+
resources:
29+
- nodes
30+
- nodes/metrics
31+
- services
32+
- endpoints
33+
- pods
34+
verbs:
35+
- get
36+
- list
37+
- watch
38+
- apiGroups:
39+
- ''
40+
resources:
41+
- configmaps
42+
verbs:
43+
- get
44+
- apiGroups:
45+
- networking.k8s.io
46+
resources:
47+
- ingresses
48+
verbs:
49+
- get
50+
- list
51+
- watch
52+
- nonResourceURLs:
53+
- /metrics
54+
verbs:
55+
- get
56+
metadata:
57+
name: prometheus
58+
namespace: default
59+
---
60+
id: monitoring.coreos.com/v1alpha1:AlertmanagerConfig:default:config-example
61+
type: Kubernetes
62+
attributes:
63+
apiVersion: monitoring.coreos.com/v1alpha1
64+
kind: AlertmanagerConfig
65+
metadata:
66+
labels:
67+
alertmanagerConfig: example
68+
name: config-example
69+
namespace: default
70+
spec:
71+
receivers:
72+
- name: webhook
73+
webhookConfigs:
74+
- url: http://example.com/
75+
route:
76+
groupBy:
77+
- job
78+
groupInterval: 5m
79+
groupWait: 30s
80+
receiver: webhook
81+
repeatInterval: 12h
82+
---
83+
id: monitoring.coreos.com/v1:Prometheus:default:example
84+
type: Kubernetes
85+
attributes:
86+
apiVersion: monitoring.coreos.com/v1
87+
kind: Prometheus
88+
metadata:
89+
name: example
90+
namespace: default
91+
spec:
92+
serviceMonitorSelector:
93+
matchLabels:
94+
prometheus: example
95+
replicas: 1
96+
scrapeInterval: 30s
97+
serviceAccountName: prometheus
98+
evaluationInterval: 30s
99+
alerting:
100+
alertmanagers:
101+
- name: alertmanager-example
102+
namespace: default
103+
port: web
104+
ruleSelector:
105+
matchLabels:
106+
role: alert-rules
107+
prometheus: example
108+
---
109+
id: monitoring.coreos.com/v1:Alertmanager:default:example
110+
type: Kubernetes
111+
attributes:
112+
apiVersion: monitoring.coreos.com/v1
113+
kind: Alertmanager
114+
metadata:
115+
name: example
116+
namespace: default
117+
spec:
118+
replicas: 3
119+
retention: 120h
120+
alertmanagerConfiguration:
121+
name: config-example
122+
---
123+
id: v1:Service:default:alertmanager-example
124+
type: Kubernetes
125+
dependsOn:
126+
- rbac.authorization.k8s.io/v1:ClusterRole:default:prometheus
127+
- rbac.authorization.k8s.io/v1:ClusterRoleBinding:default:prometheus
128+
- v1:ServiceAccount:default:prometheus
129+
attributes:
130+
apiVersion: v1
131+
kind: Service
132+
metadata:
133+
name: alertmanager-example
134+
namespace: default
135+
spec:
136+
ports:
137+
- name: web
138+
port: 9093
139+
targetPort: web
140+
- name: reloader-web
141+
port: 8080
142+
targetPort: reloader-web
143+
selector:
144+
alertmanager: example
145+
sessionAffinity: ClientIP
146+
---
147+
id: v1:Service:default:prometheus-example
148+
type: Kubernetes
149+
dependsOn:
150+
- rbac.authorization.k8s.io/v1:ClusterRole:default:prometheus
151+
- rbac.authorization.k8s.io/v1:ClusterRoleBinding:default:prometheus
152+
- v1:ServiceAccount:default:prometheus
153+
attributes:
154+
apiVersion: v1
155+
kind: Service
156+
metadata:
157+
name: prometheus-example
158+
namespace: default
159+
spec:
160+
ports:
161+
- name: web
162+
port: 9090
163+
targetPort: web
164+
- name: reloader-web
165+
port: 8080
166+
targetPort: reloader-web
167+
selector:
168+
prometheus: example
169+
sessionAffinity: ClientIP
170+
---
171+
id: v1:ServiceAccount:default:prometheus
172+
type: Kubernetes
173+
dependsOn:
174+
- rbac.authorization.k8s.io/v1:ClusterRole:default:prometheus
175+
- rbac.authorization.k8s.io/v1:ClusterRoleBinding:default:prometheus
176+
attributes:
177+
apiVersion: v1
178+
kind: ServiceAccount
179+
metadata:
180+
name: prometheus
181+
namespace: default
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
kcl_cli_configs:
2+
file:
3+
- ../base/base.k
4+
- main.k
5+
- ${KCL_MOD}/base/pkg/kusion_models/kube/render/render.k
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
import base.pkg.kusion_kubernetes.api.core.v1 as corev1
2+
import base.pkg.kusion_prometheus.monitoring.v1 as monitoringv1
3+
import base.pkg.kusion_prometheus.monitoring.v1alpha1 as monitoringv1alpha1
4+
5+
6+
# 1. creates an AlertmanagerConfig that sends notifications to a fictitious webhook service.
7+
_alertmanager_config: monitoringv1alpha1.AlertmanagerConfig{
8+
metadata = {
9+
name = "config-example"
10+
namespace = _common_namespace
11+
labels = {
12+
"alertmanagerConfig" = "example"
13+
}
14+
}
15+
spec = {
16+
route = {
17+
groupBy = ["job"]
18+
groupWait = "30s"
19+
groupInterval = "5m"
20+
repeatInterval = "12h"
21+
receiver = "webhook"
22+
}
23+
receivers = [
24+
{
25+
name = "webhook"
26+
webhookConfigs = [
27+
{
28+
url = "http://example.com/"
29+
}
30+
]
31+
}
32+
]
33+
}
34+
}
35+
36+
# 2. create an alertmanager cluster with 3 replicas and configured with alertmanager config
37+
_alertmanager: monitoringv1.Alertmanager{
38+
metadata = {
39+
name = "example"
40+
namespace = _common_namespace
41+
}
42+
spec = {
43+
replicas = 3
44+
# using AlertmanagerConfig for global configuration
45+
alertmanagerConfiguration = {
46+
name = _alertmanager_config.metadata.name
47+
}
48+
}
49+
}
50+
51+
# 3. expose alertmanager service
52+
_alertmanager_svc: corev1.Service{
53+
metadata = {
54+
name = "alertmanager-example"
55+
namespace = _common_namespace
56+
}
57+
spec = {
58+
selector = {
59+
"alertmanager" = _alertmanager.metadata.name
60+
}
61+
ports = [
62+
{
63+
name = "web"
64+
port = 9093
65+
targetPort = "web"
66+
}
67+
{
68+
name = "reloader-web"
69+
port = 8080
70+
targetPort = "reloader-web"
71+
}
72+
]
73+
sessionAffinity = "ClientIP"
74+
}
75+
}
76+
77+
# 4. create a prometheus instance, intergated with alertmanager cluster
78+
_prometheus: monitoringv1.Prometheus{
79+
metadata = {
80+
name = "example"
81+
namespace = _common_namespace
82+
}
83+
spec = {
84+
# specify service account, default sa has no permissions
85+
serviceAccountName = _rbac_name
86+
replicas = 1
87+
# ruleSelector is nil meaning that the operator picks up no rule
88+
ruleSelector = {
89+
matchLabels = {
90+
"role" = "alert-rules"
91+
"prometheus" = "example"
92+
}
93+
}
94+
serviceMonitorSelector = {
95+
matchLabels = {
96+
"prometheus" = "example"
97+
}
98+
}
99+
# intergating with alert manager by its service
100+
alerting = {
101+
alertmanagers = [
102+
{
103+
name = _alertmanager_svc.metadata.name
104+
namespace = _alertmanager_svc.metadata.namespace
105+
port = _alertmanager_svc.spec.ports[0].name
106+
}
107+
]
108+
}
109+
}
110+
}
111+
112+
# 5. expose prometheus service
113+
_prometheus_svc: corev1.Service{
114+
metadata = {
115+
name = "prometheus-example"
116+
namespace = _common_namespace
117+
}
118+
spec = {
119+
selector = {
120+
"prometheus" = _prometheus.metadata.name
121+
}
122+
ports = [
123+
{
124+
name = "web"
125+
port = 9090
126+
targetPort = "web"
127+
}
128+
{
129+
name = "reloader-web"
130+
port = 8080
131+
targetPort = "reloader-web"
132+
}
133+
]
134+
sessionAffinity = "ClientIP"
135+
}
136+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
name: prod
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
name: prometheus-install

0 commit comments

Comments
 (0)