comparison next/create_all.py @ 56:a72c47973aa4

parameterize the python version
author drewp@bigasterisk.com
date Fri, 26 Apr 2024 16:10:47 -0700
parents 24f4ec319f98
children b3addcd4486c
comparison
equal deleted inserted replaced
55:24f4ec319f98 56:a72c47973aa4
1 import json 1 from index_page import makeIndexHtml
2 from pathlib import Path 2 from output import affinityToNode, build, createIngress, createPv, createPvc, toJson, createSvc
3 3
4 4
5 def toJson(d): 5 def createAgentDeploy(tzArg, vmVersion, pipelineWebRoot, agentFileName, agentName, agentPort, scrapeMapKey, insertName, pipelineName):
6 return json.dumps(d, sort_keys=True, indent=2) 6 (build / f'{agentFileName}_deploy.yaml').write_text(
7 7 toJson({
8 8 "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": agentName },
9 build = Path('build') 9 "spec": {
10 (build / 'vmagent_deploy.yaml').write_text( 10 "replicas": 1, "strategy": { "type": "Recreate" }, "selector": { "matchLabels": { "app": agentName } },
11 toJson({ 11 "template": {
12 "apiVersion": "apps/v1", 12 "metadata": {
13 "kind": "Deployment", 13 "labels": { "app": agentName },
14 "metadata": { 14 "annotations": { "prometheus.io/scrape": "true", "prometheus.io/path": f"{pipelineWebRoot}/vmagent/metrics", "prometheus.io/port": "80" }
15 "name": "next-victoriametrics-vmagent"
16 },
17 "spec": {
18 "replicas": 1,
19 "strategy": {
20 "type": "Recreate"
21 },
22 "selector": {
23 "matchLabels": {
24 "app": "next-victoriametrics-vmagent"
25 }
26 },
27 "template": {
28 "metadata": {
29 "labels": {
30 "app": "next-victoriametrics-vmagent"
31 }, 15 },
32 "annotations": { 16 "spec": {
33 "prometheus.io/scrape": "true", 17 "volumes": [{ "name": "config", "configMap": { "name": "victoriametrics-config" } }],
34 "prometheus.io/path": "/m/metrics", 18 "serviceAccountName": "victoriametrics",
35 "prometheus.io/port": "80" 19 "containers": [{
36 } 20 "name": "vmagent",
37 }, 21 "image": f"docker.io/victoriametrics/vmagent:{vmVersion}",
38 "spec": { 22 "imagePullPolicy": "IfNotPresent",
39 "volumes": [{ 23 "args": [
40 "name": "config", 24 f"-http.pathPrefix={pipelineWebRoot}/vmagent/",
41 "configMap": { 25 tzArg,
42 "name": "victoriametrics-config" 26 f"-promscrape.config=/local/config/{scrapeMapKey}",
43 } 27 "-promscrape.configCheckInterval=5s",
44 }], 28 "-sortLabels",
45 "serviceAccountName": 29 f"-remoteWrite.url=http://{insertName}{pipelineWebRoot}/vminsert/insert/0/prometheus/api/v1/write",
46 "victoriametrics", 30 "-remoteWrite.showURL",
47 "containers": [{ 31 ],
48 "name": "vmagent", 32 "ports": [{ "containerPort": agentPort }],
49 "image": "docker.io/victoriametrics/vmagent:v1.100.1", 33 "volumeMounts": [{ "name": "config", "mountPath": "/local/config" }]
50 "imagePullPolicy": "IfNotPresent", 34 }]
51 "args": ["-http.pathPrefix=/m/next/vmagent/", "-loggerTimezone=America/Los_Angeles", "-promscrape.config=/local/config/scrape_main", "-promscrape.configCheckInterval=5s", "-sortLabels", "-remoteWrite.url=http://next-victoriametrics-vminsert/m/next/vminsert/insert/0/prometheus/api/v1/write", "-remoteWrite.showURL"], 35 }
52 "ports": [{ 36 }
53 "containerPort": 8429 37 }
38 })) # yapf: disable
39
40
41 def createInsertDeploy(tzArg, vmVersion, pipelineWebRoot, insertName, storageName, insertFileName, insertPort):
42 (build / f'{insertFileName}_deploy.yaml').write_text(
43 toJson({
44 "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": insertName },
45 "spec": {
46 "replicas": 1, "strategy": { "type": "Recreate" }, "selector": { "matchLabels": { "app": insertName } },
47 "template": {
48 "metadata": {
49 "labels": { "app": insertName },
50 "annotations": { "prometheus.io/scrape": "true", "prometheus.io/path": "/m/metrics", "prometheus.io/port": "80" }
51 },
52 "spec": {
53 "serviceAccountName": "victoriametrics",
54 "containers": [{
55 "name": "vminsert",
56 "image": f"docker.io/victoriametrics/vminsert:{vmVersion}-cluster",
57 "imagePullPolicy": "IfNotPresent",
58 "args": [
59 f"-http.pathPrefix={pipelineWebRoot}/vminsert/",
60 tzArg,
61 f"-storageNode={storageName}",
62 ],
63 "ports": [{ "containerPort": insertPort }]
64 }]
65 }
66 }
67 }
68 })) # yapf: disable
69
70
71 def createStorageDeploy(tzArg, vmVersion, pipelineWebRoot, pipelineName, retention, storageName, storageFileName, localPvHost, volName, storageInsertPort, storageSelectPort):
72 (build / f'{storageFileName}_2deploy.yaml').write_text(
73 toJson({
74 "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": storageName },
75 "spec": {
76 "replicas": 1, "strategy": { "type": "Recreate" }, "selector": { "matchLabels": { "app": storageName } },
77 "template": {
78 "metadata": {
79 "labels": { "app": storageName },
80 "annotations": { "prometheus.io/scrape": "true", "prometheus.io/path": "/m/vmstorage/metrics", "prometheus.io/port": "80" }
81 },
82 "spec": {
83 "volumes": [{ "name": "data", "persistentVolumeClaim": { "claimName": volName } }],
84 "serviceAccountName": "victoriametrics",
85 "containers": [{
86 "name": "vmstorage",
87 "image": f"docker.io/victoriametrics/vmstorage:{vmVersion}-cluster",
88 "imagePullPolicy": "IfNotPresent",
89 "args": [
90 f"-http.pathPrefix={pipelineWebRoot}/vmstorage/",
91 tzArg,
92 f"-retentionPeriod={retention}",
93 f"-storageDataPath=/data/{pipelineName}",
94 ],
95 "ports": [
96 { "containerPort": 8482, "name": "http" },
97 { "containerPort": storageInsertPort, "name": "vminsert" },
98 { "containerPort": storageSelectPort, "name": "vmselect" },
99 ],
100 "volumeMounts": [{ "name": "data", "mountPath": "/data" }]
54 }], 101 }],
55 "volumeMounts": [{ 102 "affinity": affinityToNode(localPvHost)
56 "name": "config", 103 }
57 "mountPath": "/local/config" 104 }
105 }
106 })) # yapf: disable
107
108
109 def createVmselectDeploy(tzArg, vmVersion, webRoot, objPrefix, storageSvcs, selectPort):
110 name = f"{objPrefix}-vmselect"
111 (build / f'{objPrefix}-1vmselect_deploy.yaml').write_text(
112 toJson({
113 "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": name },
114 "spec": {
115 "replicas": 1,
116 "strategy": { "type": "Recreate" },
117 "selector": { "matchLabels": { "app": name } },
118 "template": {
119 "metadata": {
120 "labels": { "app": name },
121 "annotations": { "prometheus.io/scrape": "true", "prometheus.io/path": "/m/metrics", "prometheus.io/port": "80" }
122 },
123 "spec": {
124 "serviceAccountName": "victoriametrics",
125 "containers": [{
126 "name": "vmselect", "image": f"docker.io/victoriametrics/vmselect:{vmVersion}-cluster", "imagePullPolicy": "IfNotPresent",
127 "args": [
128 f"-http.pathPrefix={webRoot}/vmselect/",
129 tzArg,
130 ] + [f"-storageNode={n}" for n in storageSvcs],
131 "ports": [{ "containerPort": selectPort }]
58 }] 132 }]
59 }] 133 }
60 } 134 }
61 } 135 }
62 } 136 })) # yapf: disable
63 })) 137
64 (build / 'vmagent_svc.yaml').write_text(toJson({"apiVersion": "v1", "kind": "Service", "metadata": {"name": "next-victoriametrics-vmagent"}, "spec": {"ports": [{"port": 80, "targetPort": 8429}], "selector": {"app": "next-victoriametrics-vmagent"}}})) 138 def createIngestPipeline(tzArg, vmVersion, webRoot, objPrefix, pipelineName, scrapeMapKey, retention):
65 139 agentName = f"{objPrefix}-{pipelineName}-vmagent"
66 (build / 'vminsert_deploy.yaml').write_text( 140 insertName = f"{objPrefix}-{pipelineName}-vminsert"
67 toJson({ 141 storageName = f"{objPrefix}-{pipelineName}-vmstorage"
68 "apiVersion": "apps/v1", 142
69 "kind": "Deployment", 143 agentFileName = f"{objPrefix}-0{pipelineName}-0vmagent"
70 "metadata": { 144 insertFileName = f"{objPrefix}-0{pipelineName}-1vminsert"
71 "name": "next-victoriametrics-vminsert" 145 storageFileName = f"{objPrefix}-0{pipelineName}-2vmstorage"
72 }, 146
73 "spec": { 147 localPvHost = "ditto"
74 "replicas": 1, 148 insertPort = 8480
75 "strategy": { 149 agentPort = 8429
76 "type": "Recreate" 150 storageInsertPort = 8400
77 }, 151 storageSelectPort = 8401
78 "selector": { 152 volName = f"{objPrefix}-data-{pipelineName}"
79 "matchLabels": { 153 request = "50Gi"
80 "app": "next-victoriametrics-vminsert" 154 pipelineWebRoot = f'{webRoot}/{pipelineName}'
81 } 155
82 }, 156 createAgentDeploy(tzArg, vmVersion, pipelineWebRoot, agentFileName, agentName, agentPort, scrapeMapKey, insertName, pipelineName)
83 "template": { 157 createInsertDeploy(tzArg, vmVersion, pipelineWebRoot, insertName, storageName, insertFileName, insertPort)
84 "metadata": { 158 createPv(storageFileName, volName, request)
85 "labels": { 159 createPvc(storageFileName, volName, request)
86 "app": "next-victoriametrics-vminsert" 160 createStorageDeploy(tzArg, vmVersion, pipelineWebRoot, pipelineName, retention, storageName, storageFileName, localPvHost, volName, storageInsertPort, storageSelectPort)
87 }, 161
88 "annotations": { 162 createSvc(agentFileName, agentName, [{"port": 80, "targetPort": agentPort}])
89 "prometheus.io/scrape": "true", 163 createSvc(insertFileName, insertName, [{"port": 80, "targetPort": insertPort}])
90 "prometheus.io/path": "/m/metrics", 164 createSvc(storageFileName,storageName, [
91 "prometheus.io/port": "80" 165 {"port": 80, "targetPort": "http", "name": "http"},
92 } 166 {"port": storageInsertPort, "targetPort": "vminsert", "name": "vminsert"},
93 }, 167 {"port": storageSelectPort, "targetPort": "vmselect", "name": "vmselect"},
94 "spec": { 168 ]) # yapf: disable
95 "serviceAccountName": "victoriametrics", 169
96 "containers": [{ 170 return storageName
97 "name": "vminsert", 171
98 "image": "docker.io/victoriametrics/vminsert:v1.100.1-cluster", 172
99 "imagePullPolicy": "IfNotPresent", 173 def createIndex(objPrefix, webRoot, html):
100 "args": ["-http.pathPrefix=/m/next/vminsert/", "-loggerTimezone=America/Los_Angeles", "-storageNode=next-victoriametrics-vmstorage"], 174 name = f'{objPrefix}-index'
101 "ports": [{ 175 httpServeRoot = '/opt/html'
102 "containerPort": 8480 176
103 }] 177 (build / f'{objPrefix}-3index_cmap.yaml').write_text(toJson({
104 }] 178 "apiVersion": "v1", "kind": "ConfigMap", "metadata": { "name": name },
105 } 179 "data": {
106 } 180 "index.html": html,
107 } 181 (??) }
108 })) 182 (??) }))
109 (build / 'vminsert_svc.yaml').write_text(toJson({"apiVersion": "v1", "kind": "Service", "metadata": {"name": "next-victoriametrics-vminsert"}, "spec": {"ports": [{"port": 80, "targetPort": 8480}], "selector": {"app": "next-victoriametrics-vminsert"}}})) 183 (??)(build / 'vmselect_svc.yaml').write_text(toJson({
110 184 (??) "apiVersion": "v1",
111 (build / 'vmstorage_pv.yaml').write_text( 185 (??) "kind": "Service",
112 toJson({ 186 (??) "metadata": {
113 "apiVersion": "v1", 187 (??) "name": "next-victoriametrics-vmselect"
114 "kind": "PersistentVolume", 188 (??) },
115 "metadata": { 189 (??) "spec": {
116 "name": "next-victoriametrics", 190 (??) "ports": [{
117 "labels": { 191 (??) "port": 80,
118 "type": "local" 192 (??) "targetPort": 8481
119 } 193 (??) }],
120 }, 194 (??) "selector": {
121 "spec": { 195 (??) "app": "next-victoriametrics-vmselect"
122 "storageClassName": "manual", 196 (??) }
123 "hostPath": { 197 (??) }
124 "path": "/opt/next-victoriametrics" 198 (??)}
125 }, 199 (??) # in vmui, set server url to
126 "capacity": { 200 (??) # https://bigasterisk.com/m/next/vmselect/select/0/prometheus
127 "storage": "50Gi" 201 (??) ))
128 }, 202 (??)
129 "accessModes": ["ReadWriteMany"], 203 (??)(build / 'vmselect_svc.yaml').write_text(
130 "persistentVolumeReclaimPolicy": "Retain", 204 (??) toJson({
131 "claimRef": { 205 (??) "apiVersion": "networking.k8s.io/v1",
132 "namespace": "default", 206 (??) "kind": "Ingress",
133 "name": "next-victoriametrics" 207 (??) "metadata": {
134 } 208 (??) "name": "next-victoriametrics",
135 } 209 (??) "annotations": {
136 })) 210 (??) "cert-manager.io/cluster-issuer": "letsencrypt-prod",
137 (build / 'vmstorage_pvc.yaml').write_text(toJson({"apiVersion": "v1", "kind": "PersistentVolumeClaim", "metadata": {"name": "next-victoriametrics"}, "spec": {"storageClassName": "", "volumeName": "next-victoriametrics", "accessModes": ["ReadWriteMany"], "resources": {"requests": {"storage": "50Gi"}}}})) 211 (??) "ingress.pomerium.io/allow_public_unauthenticated_access": "false",
138 212 (??) "ingress.pomerium.io/pass_identity_headers": "true",
139 (build / 'vmstorage_deploy.yaml').write_text( 213 (??) "ingress.pomerium.io/preserve_host_header": "true",
140 toJson({ 214 })) # yapf: disable
141 "apiVersion": "apps/v1", 215
142 "kind": "Deployment", 216 (build / f'{objPrefix}-3index_deploy.yaml').write_text(
143 "metadata": { 217 toJson({
144 "name": "next-victoriametrics-vmstorage" 218 "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": name },
145 }, 219 "spec": {
146 "spec": { 220 "replicas": 1,
147 "replicas": 1, 221 "selector": { "matchLabels": { "app": name } },
148 "strategy": { 222 "template": {
149 "type": "Recreate" 223 "metadata": { "labels": { "app": name } },
150 }, 224 "spec": {
151 "selector": { 225 "containers": [{
152 "matchLabels": { 226 "name": "webserver", "image": "docker.io/joseluisq/static-web-server", "imagePullPolicy": "IfNotPresent",
153 "app": "next-victoriametrics-vmstorage" 227 "args": [
154 } 228 f'--root={httpServeRoot}',
155 }, 229 '--directory-listing=true',
156 "template": { 230 '--experimental-metrics=true',
157 "metadata": { 231 ],
158 "labels": { 232 "ports": [{ "containerPort": 80 }],
159 "app": "next-victoriametrics-vmstorage" 233 "volumeMounts": [{ "name": "html", "mountPath": f"{httpServeRoot}{webRoot}" }]
160 },
161 "annotations": {
162 "prometheus.io/scrape": "true",
163 "prometheus.io/path": "/m/vmstorage/metrics",
164 "prometheus.io/port": "80"
165 }
166 },
167 "spec": {
168 "volumes": [{
169 "name": "data",
170 "persistentVolumeClaim": {
171 "claimName": "next-victoriametrics"
172 }
173 }],
174 "serviceAccountName": "victoriametrics",
175 "containers": [{
176 "name": "vmstorage",
177 "image": "docker.io/victoriametrics/vmstorage:v1.100.1-cluster",
178 "imagePullPolicy": "IfNotPresent",
179 "args": ["-http.pathPrefix=/m/next/vmstorage/", "-loggerTimezone=America/Los_Angeles", "-retentionPeriod=100y", "-storageDataPath=/data/100y"],
180 "ports": [{
181 "containerPort": 8482,
182 "name": "http"
183 }, {
184 "containerPort": 8400,
185 "name": "vminsert"
186 }, {
187 "containerPort": 8401,
188 "name": "vmselect"
189 }], 234 }],
190 "volumeMounts": [{ 235 "volumes": [{ "name": "html", "configMap": { "name": name, "defaultMode": 444 } }]
191 "name": "data", 236 }
192 "mountPath": "/data" 237 }
193 }] 238 }
194 }], 239 })) # yapf: disable
195 "affinity": { 240 createSvc(f'{objPrefix}-3index', f'{objPrefix}-index', [{'port': 80, 'targetPort': 80}])
196 "nodeAffinity": {
197 "requiredDuringSchedulingIgnoredDuringExecution": {
198 "nodeSelectorTerms": [{
199 "matchExpressions": [{
200 "key": "kubernetes.io/hostname",
201 "operator": "In",
202 "values": ["ditto"]
203 }]
204 }]
205 }
206 }
207 }
208 }
209 }
210 }
211 }))
212 (build / 'vmstorage_svc.yaml').write_text(toJson({"apiVersion": "v1", "kind": "Service", "metadata": {"name": "next-victoriametrics-vmstorage"}, "spec": {"ports": [{"port": 80, "targetPort": "http", "name": "http"}, {"port": 8400, "targetPort": "vminsert", "name": "vminsert"}, {"port": 8401, "targetPort": "vmselect", "name": "vmselect"}], "selector": {"app": "next-victoriametrics-vmstorage"}}}))
213
214 (build / 'vmselect_deploy.yaml').write_text(
215 toJson({
216 "apiVersion": "apps/v1",
217 "kind": "Deployment",
218 "metadata": {
219 "name": "next-victoriametrics-vmselect"
220 },
221 "spec": {
222 "replicas": 1,
223 "strategy": {
224 "type": "Recreate"
225 },
226 "selector": {
227 "matchLabels": {
228 "app": "next-victoriametrics-vmselect"
229 }
230 },
231 "template": {
232 "metadata": {
233 "labels": {
234 "app": "next-victoriametrics-vmselect"
235 },
236 "annotations": {
237 "prometheus.io/scrape": "true",
238 "prometheus.io/path": "/m/metrics",
239 "prometheus.io/port": "80"
240 }
241 },
242 "spec": {
243 "serviceAccountName": "victoriametrics",
244 "containers": [{
245 "name": "vmselect",
246 "image": "docker.io/victoriametrics/vmselect:v1.100.1-cluster",
247 "imagePullPolicy": "IfNotPresent",
248 "args": ["-http.pathPrefix=/m/next/vmselect/", "-loggerTimezone=America/Los_Angeles", "-storageNode=next-victoriametrics-vmstorage"],
249 "ports": [{
250 "containerPort": 8481
251 }]
252 }]
253 }
254 }
255 }
256 }))
257 (build / 'vmselect_svc.yaml').write_text(toJson({
258 "apiVersion": "v1",
259 "kind": "Service",
260 "metadata": {
261 "name": "next-victoriametrics-vmselect"
262 },
263 "spec": {
264 "ports": [{
265 "port": 80,
266 "targetPort": 8481
267 }],
268 "selector": {
269 "app": "next-victoriametrics-vmselect"
270 }
271 }
272 }
273 # in vmui, set server url to
274 # https://bigasterisk.com/m/next/vmselect/select/0/prometheus
275 ))
276 241
277 (build / 'vmselect_svc.yaml').write_text( 242 (build / 'vmselect_svc.yaml').write_text(
278 toJson({ 243 toJson({
279 "apiVersion": "networking.k8s.io/v1", 244 "apiVersion": "networking.k8s.io/v1",
280 "kind": "Ingress", 245 "kind": "Ingress",