import * as pulumi from "@pulumi/pulumi"; import * as k8s from "@pulumi/kubernetes"; const config = new pulumi.Config(); const bootstrapRef = new pulumi.StackReference( `${pulumi.getOrganization()}/k8s-bootstrap/dev`, ); const appsRef = new pulumi.StackReference( `${pulumi.getOrganization()}/k8s-apps/dev`, ); const kubeconfig = bootstrapRef.requireOutput("kubeconfig"); const domain = appsRef.requireOutput("domain"); const grafanaAdminPassword = config.requireSecret("grafanaAdminPassword"); const k8sProvider = new k8s.Provider("k3s", { kubeconfig }); const opts = (extras?: pulumi.ResourceOptions): pulumi.ResourceOptions => ({ provider: k8sProvider, ...extras, }); const ns = new k8s.core.v1.Namespace( "monitoring", { metadata: { name: "monitoring" } }, { provider: k8sProvider, import: "monitoring" }, ); const grafanaHost = pulumi.interpolate`grafana.${domain}`; new k8s.helm.v3.Release( "kube-prometheus-stack", { name: "kube-prometheus-stack", chart: "kube-prometheus-stack", version: "86.2.0", namespace: ns.metadata.name, repositoryOpts: { repo: "https://prometheus-community.github.io/helm-charts", }, timeout: 600, values: { grafana: { adminPassword: grafanaAdminPassword, ingress: { enabled: true, ingressClassName: "traefik", annotations: { "cert-manager.io/cluster-issuer": "letsencrypt-prod" }, hosts: [grafanaHost], tls: [{ secretName: "grafana-tls", hosts: [grafanaHost] }], }, persistence: { enabled: true, storageClassName: "longhorn", size: "2Gi", }, }, prometheus: { prometheusSpec: { storageSpec: { volumeClaimTemplate: { spec: { storageClassName: "longhorn", resources: { requests: { storage: "20Gi" } }, }, }, }, }, }, alertmanager: { enabled: false }, }, }, opts(), );