57
|
1 from pathlib import Path
|
56
|
2 from index_page import makeIndexHtml
|
|
3 from output import affinityToNode, build, createIngress, createPv, createPvc, toJson, createSvc
|
55
|
4
|
|
5
|
56
|
6 def createAgentDeploy(tzArg, vmVersion, pipelineWebRoot, agentFileName, agentName, agentPort, scrapeMapKey, insertName, pipelineName):
|
|
7 (build / f'{agentFileName}_deploy.yaml').write_text(
|
|
8 toJson({
|
|
9 "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": agentName },
|
|
10 "spec": {
|
|
11 "replicas": 1, "strategy": { "type": "Recreate" }, "selector": { "matchLabels": { "app": agentName } },
|
|
12 "template": {
|
|
13 "metadata": {
|
|
14 "labels": { "app": agentName },
|
|
15 "annotations": { "prometheus.io/scrape": "true", "prometheus.io/path": f"{pipelineWebRoot}/vmagent/metrics", "prometheus.io/port": "80" }
|
55
|
16 },
|
56
|
17 "spec": {
|
|
18 "volumes": [{ "name": "config", "configMap": { "name": "victoriametrics-config" } }],
|
|
19 "serviceAccountName": "victoriametrics",
|
|
20 "containers": [{
|
|
21 "name": "vmagent",
|
|
22 "image": f"docker.io/victoriametrics/vmagent:{vmVersion}",
|
|
23 "imagePullPolicy": "IfNotPresent",
|
|
24 "args": [
|
|
25 f"-http.pathPrefix={pipelineWebRoot}/vmagent/",
|
|
26 tzArg,
|
|
27 f"-promscrape.config=/local/config/{scrapeMapKey}",
|
|
28 "-promscrape.configCheckInterval=5s",
|
|
29 "-sortLabels",
|
|
30 f"-remoteWrite.url=http://{insertName}{pipelineWebRoot}/vminsert/insert/0/prometheus/api/v1/write",
|
|
31 "-remoteWrite.showURL",
|
|
32 ],
|
|
33 "ports": [{ "containerPort": agentPort }],
|
|
34 "volumeMounts": [{ "name": "config", "mountPath": "/local/config" }]
|
|
35 }]
|
55
|
36 }
|
|
37 }
|
|
38 }
|
56
|
39 })) # yapf: disable
|
|
40
|
55
|
41
|
56
|
42 def createInsertDeploy(tzArg, vmVersion, pipelineWebRoot, insertName, storageName, insertFileName, insertPort):
|
|
43 (build / f'{insertFileName}_deploy.yaml').write_text(
|
|
44 toJson({
|
|
45 "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": insertName },
|
|
46 "spec": {
|
|
47 "replicas": 1, "strategy": { "type": "Recreate" }, "selector": { "matchLabels": { "app": insertName } },
|
|
48 "template": {
|
|
49 "metadata": {
|
|
50 "labels": { "app": insertName },
|
|
51 "annotations": { "prometheus.io/scrape": "true", "prometheus.io/path": "/m/metrics", "prometheus.io/port": "80" }
|
55
|
52 },
|
56
|
53 "spec": {
|
|
54 "serviceAccountName": "victoriametrics",
|
|
55 "containers": [{
|
|
56 "name": "vminsert",
|
|
57 "image": f"docker.io/victoriametrics/vminsert:{vmVersion}-cluster",
|
|
58 "imagePullPolicy": "IfNotPresent",
|
|
59 "args": [
|
|
60 f"-http.pathPrefix={pipelineWebRoot}/vminsert/",
|
|
61 tzArg,
|
|
62 f"-storageNode={storageName}",
|
|
63 ],
|
|
64 "ports": [{ "containerPort": insertPort }]
|
|
65 }]
|
55
|
66 }
|
|
67 }
|
|
68 }
|
56
|
69 })) # yapf: disable
|
55
|
70
|
|
71
|
56
|
72 def createStorageDeploy(tzArg, vmVersion, pipelineWebRoot, pipelineName, retention, storageName, storageFileName, localPvHost, volName, storageInsertPort, storageSelectPort):
|
|
73 (build / f'{storageFileName}_2deploy.yaml').write_text(
|
|
74 toJson({
|
|
75 "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": storageName },
|
|
76 "spec": {
|
|
77 "replicas": 1, "strategy": { "type": "Recreate" }, "selector": { "matchLabels": { "app": storageName } },
|
|
78 "template": {
|
|
79 "metadata": {
|
|
80 "labels": { "app": storageName },
|
|
81 "annotations": { "prometheus.io/scrape": "true", "prometheus.io/path": "/m/vmstorage/metrics", "prometheus.io/port": "80" }
|
55
|
82 },
|
56
|
83 "spec": {
|
|
84 "volumes": [{ "name": "data", "persistentVolumeClaim": { "claimName": volName } }],
|
|
85 "serviceAccountName": "victoriametrics",
|
|
86 "containers": [{
|
|
87 "name": "vmstorage",
|
|
88 "image": f"docker.io/victoriametrics/vmstorage:{vmVersion}-cluster",
|
|
89 "imagePullPolicy": "IfNotPresent",
|
|
90 "args": [
|
|
91 f"-http.pathPrefix={pipelineWebRoot}/vmstorage/",
|
|
92 tzArg,
|
|
93 f"-retentionPeriod={retention}",
|
|
94 f"-storageDataPath=/data/{pipelineName}",
|
|
95 ],
|
|
96 "ports": [
|
|
97 { "containerPort": 8482, "name": "http" },
|
|
98 { "containerPort": storageInsertPort, "name": "vminsert" },
|
|
99 { "containerPort": storageSelectPort, "name": "vmselect" },
|
|
100 ],
|
|
101 "volumeMounts": [{ "name": "data", "mountPath": "/data" }]
|
55
|
102 }],
|
56
|
103 "affinity": affinityToNode(localPvHost)
|
55
|
104 }
|
|
105 }
|
|
106 }
|
56
|
107 })) # yapf: disable
|
|
108
|
55
|
109
|
56
|
110 def createVmselectDeploy(tzArg, vmVersion, webRoot, objPrefix, storageSvcs, selectPort):
|
|
111 name = f"{objPrefix}-vmselect"
|
|
112 (build / f'{objPrefix}-1vmselect_deploy.yaml').write_text(
|
|
113 toJson({
|
|
114 "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": name },
|
|
115 "spec": {
|
|
116 "replicas": 1,
|
|
117 "strategy": { "type": "Recreate" },
|
|
118 "selector": { "matchLabels": { "app": name } },
|
|
119 "template": {
|
|
120 "metadata": {
|
|
121 "labels": { "app": name },
|
|
122 "annotations": { "prometheus.io/scrape": "true", "prometheus.io/path": "/m/metrics", "prometheus.io/port": "80" }
|
55
|
123 },
|
56
|
124 "spec": {
|
|
125 "serviceAccountName": "victoriametrics",
|
|
126 "containers": [{
|
|
127 "name": "vmselect", "image": f"docker.io/victoriametrics/vmselect:{vmVersion}-cluster", "imagePullPolicy": "IfNotPresent",
|
|
128 "args": [
|
|
129 f"-http.pathPrefix={webRoot}/vmselect/",
|
|
130 tzArg,
|
|
131 ] + [f"-storageNode={n}" for n in storageSvcs],
|
|
132 "ports": [{ "containerPort": selectPort }]
|
|
133 }]
|
55
|
134 }
|
|
135 }
|
|
136 }
|
56
|
137 })) # yapf: disable
|
|
138
|
|
139 def createIngestPipeline(tzArg, vmVersion, webRoot, objPrefix, pipelineName, scrapeMapKey, retention):
|
|
140 agentName = f"{objPrefix}-{pipelineName}-vmagent"
|
|
141 insertName = f"{objPrefix}-{pipelineName}-vminsert"
|
|
142 storageName = f"{objPrefix}-{pipelineName}-vmstorage"
|
|
143
|
|
144 agentFileName = f"{objPrefix}-0{pipelineName}-0vmagent"
|
|
145 insertFileName = f"{objPrefix}-0{pipelineName}-1vminsert"
|
|
146 storageFileName = f"{objPrefix}-0{pipelineName}-2vmstorage"
|
|
147
|
|
148 localPvHost = "ditto"
|
|
149 insertPort = 8480
|
|
150 agentPort = 8429
|
|
151 storageInsertPort = 8400
|
|
152 storageSelectPort = 8401
|
|
153 volName = f"{objPrefix}-data-{pipelineName}"
|
|
154 request = "50Gi"
|
|
155 pipelineWebRoot = f'{webRoot}/{pipelineName}'
|
|
156
|
|
157 createAgentDeploy(tzArg, vmVersion, pipelineWebRoot, agentFileName, agentName, agentPort, scrapeMapKey, insertName, pipelineName)
|
|
158 createInsertDeploy(tzArg, vmVersion, pipelineWebRoot, insertName, storageName, insertFileName, insertPort)
|
|
159 createPv(storageFileName, volName, request)
|
|
160 createPvc(storageFileName, volName, request)
|
|
161 createStorageDeploy(tzArg, vmVersion, pipelineWebRoot, pipelineName, retention, storageName, storageFileName, localPvHost, volName, storageInsertPort, storageSelectPort)
|
|
162
|
|
163 createSvc(agentFileName, agentName, [{"port": 80, "targetPort": agentPort}])
|
|
164 createSvc(insertFileName, insertName, [{"port": 80, "targetPort": insertPort}])
|
|
165 createSvc(storageFileName,storageName, [
|
|
166 {"port": 80, "targetPort": "http", "name": "http"},
|
|
167 {"port": storageInsertPort, "targetPort": "vminsert", "name": "vminsert"},
|
|
168 {"port": storageSelectPort, "targetPort": "vmselect", "name": "vmselect"},
|
|
169 ]) # yapf: disable
|
|
170
|
|
171 return storageName
|
|
172
|
|
173
|
|
174 def createIndex(objPrefix, webRoot, html):
|
|
175 name = f'{objPrefix}-index'
|
|
176 httpServeRoot = '/opt/html'
|
|
177
|
|
178 (build / f'{objPrefix}-3index_cmap.yaml').write_text(toJson({
|
|
179 "apiVersion": "v1", "kind": "ConfigMap", "metadata": { "name": name },
|
|
180 "data": {
|
|
181 "index.html": html,
|
57
|
182 "index.js": Path("index.js").read_text(),
|
|
183 "index.css": Path("index.css").read_text(),
|
|
184 }
|
56
|
185 })) # yapf: disable
|
|
186
|
|
187 (build / f'{objPrefix}-3index_deploy.yaml').write_text(
|
|
188 toJson({
|
|
189 "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": name },
|
|
190 "spec": {
|
|
191 "replicas": 1,
|
|
192 "selector": { "matchLabels": { "app": name } },
|
|
193 "template": {
|
|
194 "metadata": { "labels": { "app": name } },
|
|
195 "spec": {
|
|
196 "containers": [{
|
|
197 "name": "webserver", "image": "docker.io/joseluisq/static-web-server", "imagePullPolicy": "IfNotPresent",
|
|
198 "args": [
|
|
199 f'--root={httpServeRoot}',
|
|
200 '--directory-listing=true',
|
|
201 '--experimental-metrics=true',
|
|
202 ],
|
|
203 "ports": [{ "containerPort": 80 }],
|
|
204 "volumeMounts": [{ "name": "html", "mountPath": f"{httpServeRoot}{webRoot}" }]
|
|
205 }],
|
|
206 "volumes": [{ "name": "html", "configMap": { "name": name, "defaultMode": 444 } }]
|
|
207 }
|
|
208 }
|
|
209 }
|
|
210 })) # yapf: disable
|
|
211 createSvc(f'{objPrefix}-3index', f'{objPrefix}-index', [{'port': 80, 'targetPort': 80}])
|
55
|
212
|
57
|
213
|
|
214 def main():
|
|
215 tzArg = "-loggerTimezone=America/Los_Angeles"
|
|
216 objPrefix = "next-victoriametrics" # prefix on all k8s object names
|
|
217 webRoot = "/m/next"
|
|
218 vmVersion = "v1.100.1"
|
|
219 webHost = 'bigasterisk.com'
|
|
220 pipelines = [
|
|
221 ('forever', '100y'),
|
|
222 ('recent', '90y'),
|
|
223 ]
|
|
224 storageSvcs = [createIngestPipeline(tzArg, vmVersion, webRoot, objPrefix, p, f'scrape_{p}', ret) for p, ret in pipelines]
|
|
225
|
|
226 selectPort = 8481
|
|
227 createVmselectDeploy(tzArg, vmVersion, webRoot, objPrefix, storageSvcs, selectPort)
|
|
228 createSvc(f'{objPrefix}-1vmselect', f"{objPrefix}-vmselect", [{"port": 80, "targetPort": selectPort}])
|
|
229
|
|
230 ingressPaths = [
|
|
231 { "pathType": "Prefix", "path": f"{webRoot}/", "backend": { "service": { "name": f"{objPrefix}-index", "port": { "number": 80 } } } },
|
|
232 { "pathType": "Prefix", "path": f"{webRoot}/vmselect/", "backend": { "service": { "name": f"{objPrefix}-vmselect", "port": { "number": 80 } } } },
|
|
233 ] # yapf: disable
|
|
234 for p, _ in pipelines:
|
|
235 ingressPaths.extend([
|
|
236 { "pathType": "Prefix", "path": f"{webRoot}/{p}/vmagent/", "backend": { "service": { "name": f"{objPrefix}-{p}-vmagent", "port": { "number": 80 } } } },
|
|
237 { "pathType": "Prefix", "path": f"{webRoot}/{p}/vminsert/", "backend": { "service": { "name": f"{objPrefix}-{p}-vminsert", "port": { "number": 80 } } } },
|
|
238 { "pathType": "Prefix", "path": f"{webRoot}/{p}/vmstorage/", "backend": { "service": { "name": f"{objPrefix}-{p}-vmstorage", "port": { "number": 80 } } } },
|
|
239 ]) # yapf: disable
|
|
240
|
|
241 policy = """\
|
|
242 allow:
|
|
243 or:
|
|
244 - { email: { is: "drewpca@gmail.com" }}
|
|
245 - { email: { is: "kelsimp@gmail.com" }}
|
|
246 """
|
|
247 createIngress(f'{objPrefix}-2ingress.yaml', objPrefix, policy, ingressPaths, webHost)
|
|
248 createIndex(objPrefix, webRoot, makeIndexHtml(objPrefix, webRoot, webHost))
|
|
249 # this should also emit a static html page and web server deploy that serves at webRoot and has a map of everything
|
|
250
|
|
251
|
|
252 main()
|
|
253
|
|
254 # in vmui, set server url to
|
|
255 # https://bigasterisk.com{webRoot}/vmselect/select/0/prometheus
|