comparison create_k8s.py @ 67:adde35eb4773

collapse ./next to ./
author drewp@bigasterisk.com
date Fri, 03 May 2024 11:21:08 -0700
parents next/create_k8s.py@8134cd480817
children c5e98d891638
comparison
equal deleted inserted replaced
66:429bfd62e6ba 67:adde35eb4773
1 from pathlib import Path
2 from index_page import makeIndexHtml
3 from output import affinityToNode, build, createIngress, createPv, createPvc, toJson, createSvc
4
5
6 def createAgentDeploy(tzArg, vmVersion, pipelineWebRoot, agentFileName, agentName, agentPort, scrapeMapKey, insertName, objPrefix):
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" }
16 },
17 "spec": {
18 "volumes": [{ "name": "config", "configMap": { "name": f"{objPrefix}-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 }]
36 }
37 }
38 }
39 })) # yapf: disable
40
41
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" }
52 },
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 }]
66 }
67 }
68 }
69 })) # yapf: disable
70
71
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" }
82 },
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" }]
102 }],
103 "affinity": affinityToNode(localPvHost)
104 }
105 }
106 }
107 })) # yapf: disable
108
109
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" }
123 },
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 }]
134 }
135 }
136 }
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, objPrefix)
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,
182 "index.js": Path("index.js").read_text(),
183 "index.css": Path("index.css").read_text(),
184 }
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}])
212
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}.yaml', 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
250
251 main()
252
253 # in vmui, set server url to
254 # https://bigasterisk.com{webRoot}/vmselect/select/0/prometheus