changeset 72:85d9dae18656

fix up vmalert k8s objs
author drewp@bigasterisk.com
date Fri, 03 May 2024 13:33:33 -0700
parents bfacf01fd119
children c3d13fab248e
files create_k8s.py create_scrape_configs.py index_page.py
diffstat 3 files changed, 75 insertions(+), 215 deletions(-) [+]
line wrap: on
line diff
--- a/create_k8s.py	Fri May 03 12:27:16 2024 -0700
+++ b/create_k8s.py	Fri May 03 13:33:33 2024 -0700
@@ -211,131 +211,64 @@
     createSvc(f'{objPrefix}-3index', f'{objPrefix}-index', [{'port': 80, 'targetPort': 80}])
 
 
-def createAlertObjs(objPrefix, webRoot):
-    (build / f'{objPrefix}-4vmalert_0pv.yaml').write_text(
-        toJson({
-            "apiVersion": "v1",
-            "kind": "PersistentVolume",
-            "metadata": {
-                "name": "opt-alertmanager",
-                "labels": {
-                    "type": "local"
-                }
-            },
-            "spec": {
-                "storageClassName": "manual",
-                "hostPath": {
-                    "path": "/opt/alertmanager"
-                },
-                "capacity": {
-                    "storage": "50Gi"
-                },
-                "accessModes": ["ReadWriteOnce"],
-                "persistentVolumeReclaimPolicy": "Retain",
-                "claimRef": {
-                    "namespace": "default",
-                    "name": "opt-alertmanager"
-                }
-            }
-        }))
-    (build / f'{objPrefix}-4vmalert_1pvc.yaml').write_text(toJson({
-        "apiVersion": "v1",
-        "kind": "PersistentVolumeClaim",
-        "metadata": {
-            "name": "opt-alertmanager"
-        },
-        "spec": {
-            "storageClassName": "",
-            "volumeName": "opt-alertmanager",
-            "accessModes": ["ReadWriteOnce"],
-            "resources": {
-                "requests": {
-                    "storage": "50Gi"
-                }
-            }
-        },
-    }))
+def createVmalertObjs(tzArg, objPrefix, webRoot, policy, vmVersion):
+    vmalertName = f"{objPrefix}-vmalert"
     (build / f'{objPrefix}-4vmalert_2deploy.yaml').write_text(
         toJson({
-            "apiVersion": "apps/v1",
-            "kind": "Deployment",
-            "metadata": {
-                "name": "vmalert"
-            },
+            "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": vmalertName },
             "spec": {
                 "replicas": 1,
-                "strategy": {
-                    "type": "Recreate"
-                },
-                "selector": {
-                    "matchLabels": {
-                        "app": "vmalert"
-                    }
-                },
+                "strategy": { "type": "Recreate" },
+                "selector": { "matchLabels": { "app": vmalertName } },
                 "template": {
-                    "metadata": {
-                        "labels": {
-                            "app": "vmalert"
-                        },
-                        "annotations": {
-                            "prometheus.io/scrape": "true"
-                        }
-                    },
+                    "metadata": { "labels": { "app": vmalertName }, },
                     "spec": {
-                        "volumes": [{
-                            "name": "config",
-                            "configMap": {
-                                "name": "victoriametrics-config"
-                            }
-                        }],
-                        "serviceAccountName":
-                            "victoriametrics",
+                        "volumes": [{ "name": "config", "configMap": { "name": "victoriametrics-config" } }],
+                        "serviceAccountName": "victoriametrics",
                         "containers": [{
-                            "name": "vmalert",
-                            "image": "docker.io/victoriametrics/vmalert:v1.91.2",
+                            "name": "vmalert", "image": f"docker.io/victoriametrics/vmalert:{vmVersion}", "imagePullPolicy": "IfNotPresent",
                             "args": [
+                                tzArg,
+                                "-loggerLevel=INFO",
                                 "-configCheckInterval=5s",
-                                "-datasource.url=http://victoriametrics/m/",
                                 "-datasource.queryStep=5m",
                                 "-evaluationInterval=1m",
-                                "-external.url=https://bigasterisk.com/vmalert",
-                                "-loggerLevel=INFO",
-                                "-loggerTimezone=America/Los_Angeles",
-                                "-memory.allowedBytes=512MB",
-                                "-notifier.url=http://alertmanager",
-                                "-remoteRead.url=http://victoriametrics/m/",
-                                "-remoteWrite.url=http://victoriametrics/m/",
                                 "-rule=/local/rules",
+
+                                # used in a field of the alert to link back to vmalert's info page
+                                f"-external.url=https://bigasterisk.com{webRoot}/vmalert",
+
+                                f"-datasource.url=http://{objPrefix}-vmselect/m/vmselect/select/0/prometheus",
+                                f"-http.pathPrefix={webRoot}/vmalert/",
+                                f"-notifier.url=http://{objPrefix}-alertmanager",
+
+                                # todo: remoteWrite should go to vminsert; not sure how to test it
+                                # "-remoteRead.url=http://victoriametrics/m/",
+                                # "-remoteWrite.url=http://victoriametrics/m/",
                             ],
-                            "ports": [{
-                                "containerPort": 8880
-                            }],
-                            "volumeMounts": [{
-                                "name": "config",
-                                "mountPath": "/local"
-                            }]
-                        }]
+                            "ports": [{ "containerPort": 8880 }],
+                            "volumeMounts": [{ "name": "config", "mountPath": "/local" }]
+                        }],
                     }
                 }
             }
-        }))
+        }))  # yapf: disable
+
+    createSvc(f'{objPrefix}-4vmalert', vmalertName, [{"port": 80, "targetPort": 8880}])
 
-    (build / f'{objPrefix}-4vmalert_svc.yaml').write_text(toJson({
-        "apiVersion": "v1",
-        "kind": "Service",
-        "metadata": {
-            "name": "vmalert"
-        },
-        "spec": {
-            "ports": [{
-                "port": 80,
-                "targetPort": 8880
-            }],
-            "selector": {
-                "app": "vmalert"
-            }
-        },
-    }))
+    createIngress(
+        f'{objPrefix}-4vmalert_ingress.yaml',
+        'vmalert',
+        policy,
+        [{ "pathType": "Prefix", "path": f"{webRoot}/vmalert/", "backend": { "service": { "name": vmalertName, "port": { "number": 80 } } } }],
+        "bigasterisk.com",
+    )  # yapf: disable
+
+
+def createAlertmanagerObjs(tzArg, objPrefix, webRoot, policy):
+    createPv(f'{objPrefix}-4vmalert', "opt-alertmanager", '50Gi')
+    createPvc(f'{objPrefix}-4vmalert', "opt-alertmanager", '50Gi')
+
     (build / f'{objPrefix}-5alertmanager_deploy.yaml').write_text(
         toJson({
             "apiVersion": "apps/v1",
@@ -367,6 +300,7 @@
                         "containers": [{
                             "name": "alertmanager",
                             "image": "docker.io/prom/alertmanager:v0.27.0",
+                            "imagePullPolicy": "IfNotPresent",
                             "args": [
                                 "--config.file=/alertmanager/alertmanager.yml",
                                 "--web.external-url=https://bigasterisk.com/alertmanager/",
@@ -381,118 +315,32 @@
                                 "mountPath": "/alertmanager"
                             }]
                         }],
-                        "affinity": {
-                            "nodeAffinity": {
-                                "requiredDuringSchedulingIgnoredDuringExecution": {
-                                    "nodeSelectorTerms": [{
-                                        "matchExpressions": [{
-                                            "key": "kubernetes.io/hostname",
-                                            "operator": "In",
-                                            "values": ["ditto"]
-                                        }]
-                                    }]
-                                }
-                            }
-                        }
+                        "affinity": affinityToNode("ditto"),
                     }
                 }
             }
         }))
-    (build / f'{objPrefix}-5alertmanager_svc.yaml').write_text(toJson({
-        "apiVersion": "v1",
-        "kind": "Service",
-        "metadata": {
-            "name": "alertmanager"
-        },
-        "spec": {
-            "ports": [{
-                "port": 80,
-                "targetPort": 9093
-            }],
-            "selector": {
-                "app": "alertmanager"
-            }
-        },
-    }))
-    (build / f'{objPrefix}-4vmalert_ingress.yaml').write_text(
-        toJson({
-            "apiVersion": "networking.k8s.io/v1",
-            "kind": "Ingress",
-            "metadata": {
-                "name": "vmalert",
-                "annotations": {
-                    "cert-manager.io/cluster-issuer": "letsencrypt-prod",
-                    "ingress.pomerium.io/allow_public_unauthenticated_access": "false",
-                    "ingress.pomerium.io/pass_identity_headers": "true",
-                    "ingress.pomerium.io/preserve_host_header": "true",
-                    "ingress.pomerium.io/policy": "allow:\n  or: \n    - { email: { is: \"drewpca@gmail.com\" }}\n    - { email: { is: \"kelsimp@gmail.com\" }}\n"
-                }
-            },
-            "spec": {
-                "ingressClassName": "pomerium",
-                "rules": [{
-                    "host": "bigasterisk.com",
-                    "http": {
-                        "paths": [{
-                            "pathType": "Prefix",
-                            "path": "/vmalert/",
-                            "backend": {
-                                "service": {
-                                    "name": "vmalert",
-                                    "port": {
-                                        "number": 80
-                                    }
-                                }
-                            }
-                        }]
+
+    createSvc(f'{objPrefix}-5alertmanager', "alertmanager", [{"port": 80, "targetPort": 9093}])
+    createIngress(
+        f'{objPrefix}-5alertmanager_ingress.yaml',
+        "alertmanager",
+        policy,
+        #                    "ingress.pomerium.io/prefix_rewrite": "/"
+        [{
+            "pathType": "Prefix",
+            "path": "/alertmanager/",
+            "backend": {
+                "service": {
+                    "name": "alertmanager",
+                    "port": {
+                        "number": 80
                     }
-                }],
-                "tls": [{
-                    "hosts": ["bigasterisk.com"],
-                    "secretName": "bigasterisk.com-tls"
-                }]
+                }
             }
-        }))
-    (build / f'{objPrefix}-5alertmanager_ingress.yaml').write_text(
-        toJson({
-            "apiVersion": "networking.k8s.io/v1",
-            "kind": "Ingress",
-            "metadata": {
-                "name": "alertmanager",
-                "annotations": {
-                    "cert-manager.io/cluster-issuer": "letsencrypt-prod",
-                    "ingress.pomerium.io/allow_public_unauthenticated_access": "false",
-                    "ingress.pomerium.io/pass_identity_headers": "true",
-                    "ingress.pomerium.io/preserve_host_header": "true",
-                    "ingress.pomerium.io/policy": "allow:\n  or: \n    - { email: { is: \"drewpca@gmail.com\" }}\n    - { email: { is: \"kelsimp@gmail.com\" }}\n",
-                    "ingress.pomerium.io/prefix_rewrite": "/"
-                }
-            },
-            "spec": {
-                "ingressClassName": "pomerium",
-                "rules": [{
-                    "host": "bigasterisk.com",
-                    "http": {
-                        "paths": [{
-                            "pathType": "Prefix",
-                            "path": "/alertmanager/",
-                            "backend": {
-                                "service": {
-                                    "name": "alertmanager",
-                                    "port": {
-                                        "number": 80
-                                    }
-                                }
-                            }
-                        }]
-                    }
-                }],
-                "tls": [{
-                    "hosts": ["bigasterisk.com"],
-                    "secretName": "bigasterisk.com-tls"
-                }]
-            }
-        }))
+        }],
+        "bigasterisk.com",
+    )
 
 
 def main():
@@ -530,7 +378,8 @@
     """
     createIngress(f'{objPrefix}-2ingress.yaml', objPrefix, policy, ingressPaths, webHost)
     createIndex(objPrefix, webRoot, makeIndexHtml(objPrefix, webRoot, webHost))
-    createAlertObjs(objPrefix, webRoot)
+    createVmalertObjs(tzArg, objPrefix, webRoot, policy, vmVersion)
+    # createAlertmanagerObjs(tzArg, objPrefix, webRoot, policy)
 
 
 main()
--- a/create_scrape_configs.py	Fri May 03 12:27:16 2024 -0700
+++ b/create_scrape_configs.py	Fri May 03 13:33:33 2024 -0700
@@ -61,6 +61,7 @@
     jobConfig(name="victoriametrics-recent-vminsert",   metrics_path='/m/recent/vminsert/metrics',  targets=FromName),
     jobConfig(name="victoriametrics-recent-vmstorage",  metrics_path='/m/recent/vmstorage/metrics', targets=FromName),
     jobConfig(name="victoriametrics-vmselect",          metrics_path='/m/vmselect/metrics',         targets=FromName),
+    jobConfig(name="victoriametrics-vmalert",           metrics_path='/m/vmalert/metrics',          targets=FromName),
     jobConfig(name="victoriametrics-index",                                                         targets=FromName),
 
     # todo:
--- a/index_page.py	Fri May 03 12:27:16 2024 -0700
+++ b/index_page.py	Fri May 03 13:33:33 2024 -0700
@@ -67,6 +67,16 @@
               </table>
             </section>  
               
+            <section>
+              <h2>vmalert</h2>
+              <table>
+                <tr>
+                  <td><a href="/vmalert">vmalert</a></td>
+                  <td><a href="/vmalert/metrics">metrics</a></td>
+                </tr>
+              </table>
+            </section>  
+              
             <script src="index.js"></script>
             <script> 
               init("https://{webHost}{webRoot}/vmselect/select/0/prometheus");