Mercurial > code > home > repos > victoriametrics
annotate create_k8s.py @ 68:c5e98d891638
remove 'next' prefix
author | drewp@bigasterisk.com |
---|---|
date | Fri, 03 May 2024 11:32:24 -0700 |
parents | adde35eb4773 |
children | 6a021aa7b4be |
rev | line source |
---|---|
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 | |
60
e3151ab43579
moving scrape target configs in py, and into separate retention classes
drewp@bigasterisk.com
parents:
57
diff
changeset
|
6 def createAgentDeploy(tzArg, vmVersion, pipelineWebRoot, agentFileName, agentName, agentPort, scrapeMapKey, insertName, objPrefix): |
56 | 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": { |
60
e3151ab43579
moving scrape target configs in py, and into separate retention classes
drewp@bigasterisk.com
parents:
57
diff
changeset
|
18 "volumes": [{ "name": "config", "configMap": { "name": f"{objPrefix}-config" } }], |
56 | 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 | |
60
e3151ab43579
moving scrape target configs in py, and into separate retention classes
drewp@bigasterisk.com
parents:
57
diff
changeset
|
157 createAgentDeploy(tzArg, vmVersion, pipelineWebRoot, agentFileName, agentName, agentPort, scrapeMapKey, insertName, objPrefix) |
56 | 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 |
62
8134cd480817
make next/ a complete standalone setup dir- no deps on ./
drewp@bigasterisk.com
parents:
60
diff
changeset
|
186 |
56 | 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" | |
68 | 216 objPrefix = "victoriametrics" # prefix on all k8s object names |
217 webRoot = "/m" | |
57 | 218 vmVersion = "v1.100.1" |
219 webHost = 'bigasterisk.com' | |
220 pipelines = [ | |
221 ('forever', '100y'), | |
222 ('recent', '90y'), | |
223 ] | |
60
e3151ab43579
moving scrape target configs in py, and into separate retention classes
drewp@bigasterisk.com
parents:
57
diff
changeset
|
224 storageSvcs = [createIngestPipeline(tzArg, vmVersion, webRoot, objPrefix, p, f'scrape_{p}.yaml', ret) for p, ret in pipelines] |
57 | 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 | |
250 | |
251 main() | |
252 | |
253 # in vmui, set server url to | |
254 # https://bigasterisk.com{webRoot}/vmselect/select/0/prometheus |