feat(monitoring): Scrape node and pod metrics, add logs and Pi dashboards

This commit is contained in:
2026-10-10 12:56:21 +05:30
parent a3c15d1aaa
commit 27dc30693b
14 changed files with 2298 additions and 110 deletions
-1
View File
@@ -9,7 +9,6 @@ data:
metadata: metadata:
name: ArgoCD name: ArgoCD
entries: entries:
# Public client: the CLI can't keep a secret, so ArgoCD uses PKCE instead.
- model: authentik_providers_oauth2.oauth2provider - model: authentik_providers_oauth2.oauth2provider
id: argocd-provider id: argocd-provider
identifiers: identifiers:
-1
View File
@@ -24,7 +24,6 @@ data:
identifiers: identifiers:
path: mounted/cm-blueprint-qbittorrent/qbittorrent.yaml path: mounted/cm-blueprint-qbittorrent/qbittorrent.yaml
required: true required: true
# Serves forward auth for the apps behind the authentik middleware.
- model: authentik_outposts.outpost - model: authentik_outposts.outpost
identifiers: identifiers:
managed: goauthentik.io/outposts/embedded managed: goauthentik.io/outposts/embedded
@@ -9,8 +9,7 @@ data:
metadata: metadata:
name: WireGuard admin name: WireGuard admin
entries: entries:
# wg-easy rejects logins unless email_verified is true; the default email # wg-easy requires email_verified, which the default mapping sends as false.
# mapping always sends false.
- model: authentik_providers_oauth2.scopemapping - model: authentik_providers_oauth2.scopemapping
id: verified-email id: verified-email
identifiers: identifiers:
@@ -52,7 +51,7 @@ data:
name: WireGuard Admin name: WireGuard Admin
provider: !KeyOf wireguard-admin-provider provider: !KeyOf wireguard-admin-provider
meta_launch_url: https://wg-admin.whyredfire.dev meta_launch_url: https://wg-admin.whyredfire.dev
# wg-easy makes every user it registers an admin, so only admins may log in. # wg-easy makes every user an admin.
- model: authentik_policies.policybinding - model: authentik_policies.policybinding
identifiers: identifiers:
order: 0 order: 0
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,213 @@
apiVersion: v1
kind: ConfigMap
metadata:
labels:
grafana_dashboard: "1"
name: grafana-dashboard-http-requests
namespace: monitoring
data:
http-requests.json: |
{
"uid": "http-requests",
"title": "HTTP requests",
"editable": true,
"schemaVersion": 41,
"refresh": "",
"time": {
"from": "now-1h",
"to": "now"
},
"timezone": "browser",
"tags": [],
"templating": {
"list": []
},
"panels": [
{
"type": "timeseries",
"title": "Requests by host",
"id": 1,
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 0
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum by (RequestHost) (count_over_time({namespace=\"traefik\"} | json | __error__=\"\" | RequestHost != \"\" [$__auto]))",
"legendFormat": "{{RequestHost}}",
"queryType": "range"
}
],
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": {
"fillOpacity": 80,
"showPoints": "never",
"stacking": {
"mode": "normal"
},
"drawStyle": "bars"
}
},
"overrides": []
}
},
{
"type": "timeseries",
"title": "Responses by status",
"id": 2,
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 0
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum by (DownstreamStatus) (count_over_time({namespace=\"traefik\"} | json | __error__=\"\" | RequestHost != \"\" [$__auto]))",
"legendFormat": "{{DownstreamStatus}}",
"queryType": "range"
}
],
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": {
"fillOpacity": 80,
"showPoints": "never",
"stacking": {
"mode": "normal"
},
"drawStyle": "bars"
}
},
"overrides": []
}
},
{
"type": "timeseries",
"title": "p95 response time by host",
"id": 3,
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 8,
"w": 24,
"x": 0,
"y": 8
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "quantile_over_time(0.95, {namespace=\"traefik\"} | json | __error__=\"\" | RequestHost != \"\" | unwrap Duration [$__auto]) by (RequestHost)",
"legendFormat": "{{RequestHost}}",
"queryType": "range"
}
],
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"fieldConfig": {
"defaults": {
"unit": "ns",
"custom": {
"fillOpacity": 10,
"showPoints": "never"
}
},
"overrides": []
}
},
{
"type": "logs",
"title": "Access log",
"id": 4,
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 12,
"w": 24,
"x": 0,
"y": 16
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "loki",
"uid": "loki"
},
"queryType": "range",
"expr": "{namespace=\"traefik\"} | json | __error__=\"\" | RequestHost != \"\" | line_format \"{{.DownstreamStatus}} {{.RequestMethod}} {{.RequestHost}}{{.RequestPath}} {{div .Duration 1000000}}ms {{.ClientHost}}\""
}
],
"options": {
"showTime": true,
"wrapLogMessage": false,
"sortOrder": "Descending",
"enableLogDetails": true,
"dedupStrategy": "none",
"showLabels": false
}
}
],
"annotations": {
"list": []
}
}
@@ -0,0 +1,985 @@
apiVersion: v1
kind: ConfigMap
metadata:
labels:
grafana_dashboard: "1"
name: grafana-dashboard-raspberry-pi
namespace: monitoring
data:
raspberry-pi.json: |
{
"uid": "raspberry-pi",
"title": "Raspberry Pi",
"editable": true,
"schemaVersion": 41,
"refresh": "1m",
"time": {
"from": "now-6h",
"to": "now"
},
"timezone": "browser",
"tags": [],
"templating": {
"list": [
{
"name": "namespace",
"label": "Namespace",
"type": "query",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"query": {
"query": "label_values(container_cpu_usage_seconds_total, namespace)",
"refId": "ns"
},
"definition": "label_values(container_cpu_usage_seconds_total, namespace)",
"multi": true,
"includeAll": true,
"current": {
"text": "All",
"value": "$__all"
},
"refresh": 2,
"sort": 1
}
]
},
"panels": [
{
"type": "row",
"title": "Node",
"id": 1,
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 0
},
"panels": []
},
{
"type": "stat",
"title": "CPU",
"id": 2,
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"gridPos": {
"h": 4,
"w": 4,
"x": 0,
"y": 1
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "100 * (1 - avg(rate(node_cpu_seconds_total{mode=\"idle\"}[$__rate_interval])))",
"instant": true
}
],
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
},
"colorMode": "value",
"graphMode": "none"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "orange",
"value": 70
},
{
"color": "red",
"value": 90
}
]
},
"decimals": 0
},
"overrides": []
}
},
{
"type": "stat",
"title": "Memory",
"id": 3,
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"gridPos": {
"h": 4,
"w": 4,
"x": 4,
"y": 1
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)",
"instant": true
}
],
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
},
"colorMode": "value",
"graphMode": "none"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "orange",
"value": 75
},
{
"color": "red",
"value": 90
}
]
},
"decimals": 0
},
"overrides": []
}
},
{
"type": "stat",
"title": "Disk /",
"id": 4,
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"gridPos": {
"h": 4,
"w": 4,
"x": 8,
"y": 1
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "100 * (1 - node_filesystem_avail_bytes{mountpoint=\"/\"} / node_filesystem_size_bytes{mountpoint=\"/\"})",
"instant": true
}
],
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
},
"colorMode": "value",
"graphMode": "none"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "orange",
"value": 75
},
{
"color": "red",
"value": 90
}
]
},
"decimals": 0
},
"overrides": []
}
},
{
"type": "stat",
"title": "CPU temperature",
"id": 5,
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"gridPos": {
"h": 4,
"w": 4,
"x": 12,
"y": 1
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "node_thermal_zone_temp{type=\"cpu-thermal\"}",
"instant": true
}
],
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
},
"colorMode": "value",
"graphMode": "none"
},
"fieldConfig": {
"defaults": {
"unit": "celsius",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "orange",
"value": 70
},
{
"color": "red",
"value": 80
}
]
},
"decimals": 0
},
"overrides": []
}
},
{
"type": "stat",
"title": "NVMe temperature",
"id": 6,
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"gridPos": {
"h": 4,
"w": 4,
"x": 16,
"y": 1
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "max(node_hwmon_temp_celsius{chip=\"nvme_nvme0\"})",
"instant": true
}
],
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
},
"colorMode": "value",
"graphMode": "none"
},
"fieldConfig": {
"defaults": {
"unit": "celsius",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "orange",
"value": 60
},
{
"color": "red",
"value": 70
}
]
},
"decimals": 0
},
"overrides": []
}
},
{
"type": "stat",
"title": "Uptime",
"id": 7,
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"gridPos": {
"h": 4,
"w": 4,
"x": 20,
"y": 1
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "time() - node_boot_time_seconds",
"instant": true
}
],
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
},
"colorMode": "value",
"graphMode": "none"
},
"fieldConfig": {
"defaults": {
"unit": "s",
"decimals": 0
},
"overrides": []
}
},
{
"type": "timeseries",
"title": "CPU",
"id": 8,
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 5
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "100 * (1 - avg(rate(node_cpu_seconds_total{mode=\"idle\"}[$__rate_interval])))",
"legendFormat": "used"
},
{
"refId": "B",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "100 * avg(rate(node_cpu_seconds_total{mode=\"iowait\"}[$__rate_interval]))",
"legendFormat": "iowait"
}
],
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"custom": {
"fillOpacity": 10,
"showPoints": "never"
}
},
"overrides": []
}
},
{
"type": "timeseries",
"title": "Memory",
"id": 9,
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 5
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes",
"legendFormat": "used"
},
{
"refId": "B",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "node_memory_MemAvailable_bytes",
"legendFormat": "available"
}
],
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"fieldConfig": {
"defaults": {
"unit": "bytes",
"custom": {
"fillOpacity": 10,
"showPoints": "never",
"stacking": {
"mode": "normal"
}
}
},
"overrides": []
}
},
{
"type": "timeseries",
"title": "Disk I/O",
"id": 10,
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 13
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "sum(rate(node_disk_read_bytes_total{device=~\"nvme.+n1|mmcblk0\"}[$__rate_interval]))",
"legendFormat": "read"
},
{
"refId": "B",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "sum(rate(node_disk_written_bytes_total{device=~\"nvme.+n1|mmcblk0\"}[$__rate_interval]))",
"legendFormat": "written"
}
],
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"fieldConfig": {
"defaults": {
"unit": "Bps",
"custom": {
"fillOpacity": 10,
"showPoints": "never"
}
},
"overrides": []
}
},
{
"type": "timeseries",
"title": "Network",
"id": 11,
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 13
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "rate(node_network_receive_bytes_total{device=~\"eth0|wlan0\"}[$__rate_interval])",
"legendFormat": "{{device}} in"
},
{
"refId": "B",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "rate(node_network_transmit_bytes_total{device=~\"eth0|wlan0\"}[$__rate_interval])",
"legendFormat": "{{device}} out"
}
],
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"fieldConfig": {
"defaults": {
"unit": "Bps",
"custom": {
"fillOpacity": 10,
"showPoints": "never"
}
},
"overrides": []
}
},
{
"type": "timeseries",
"title": "Temperatures",
"id": 12,
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"gridPos": {
"h": 7,
"w": 24,
"x": 0,
"y": 21
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "node_thermal_zone_temp{type=\"cpu-thermal\"}",
"legendFormat": "cpu"
},
{
"refId": "B",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "max(node_hwmon_temp_celsius{chip=\"nvme_nvme0\"})",
"legendFormat": "nvme"
}
],
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"fieldConfig": {
"defaults": {
"unit": "celsius",
"custom": {
"fillOpacity": 10,
"showPoints": "never"
}
},
"overrides": []
}
},
{
"type": "row",
"title": "Pods",
"id": 13,
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 28
},
"panels": []
},
{
"type": "timeseries",
"title": "CPU by namespace",
"id": 14,
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 29
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "sum by (namespace) (rate(container_cpu_usage_seconds_total{container!=\"\",namespace=~\"$namespace\"}[$__rate_interval]))",
"legendFormat": "{{namespace}}"
}
],
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"fieldConfig": {
"defaults": {
"unit": "cores",
"custom": {
"fillOpacity": 10,
"showPoints": "never",
"stacking": {
"mode": "normal"
}
}
},
"overrides": []
}
},
{
"type": "timeseries",
"title": "Memory by namespace",
"id": 15,
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 29
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "sum by (namespace) (container_memory_working_set_bytes{container!=\"\",namespace=~\"$namespace\"})",
"legendFormat": "{{namespace}}"
}
],
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"fieldConfig": {
"defaults": {
"unit": "bytes",
"custom": {
"fillOpacity": 10,
"showPoints": "never",
"stacking": {
"mode": "normal"
}
}
},
"overrides": []
}
},
{
"type": "timeseries",
"title": "Top pods by CPU",
"id": 16,
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 37
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "topk(10, sum by (namespace, pod) (rate(container_cpu_usage_seconds_total{container!=\"\",namespace=~\"$namespace\"}[$__rate_interval])))",
"legendFormat": "{{namespace}}/{{pod}}"
}
],
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"fieldConfig": {
"defaults": {
"unit": "cores",
"custom": {
"fillOpacity": 10,
"showPoints": "never"
}
},
"overrides": []
}
},
{
"type": "timeseries",
"title": "Top pods by memory",
"id": 17,
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 37
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "topk(10, sum by (namespace, pod) (container_memory_working_set_bytes{container!=\"\",namespace=~\"$namespace\"}))",
"legendFormat": "{{namespace}}/{{pod}}"
}
],
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"fieldConfig": {
"defaults": {
"unit": "bytes",
"custom": {
"fillOpacity": 10,
"showPoints": "never"
}
},
"overrides": []
}
},
{
"type": "timeseries",
"title": "Top pods by disk writes",
"id": 18,
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 45
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "topk(10, sum by (namespace, pod) (rate(container_fs_writes_bytes_total{container!=\"\",namespace=~\"$namespace\"}[$__rate_interval])))",
"legendFormat": "{{namespace}}/{{pod}}"
}
],
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"fieldConfig": {
"defaults": {
"unit": "Bps",
"custom": {
"fillOpacity": 10,
"showPoints": "never"
}
},
"overrides": []
}
},
{
"type": "timeseries",
"title": "Network by namespace",
"id": 19,
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 45
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "sum by (namespace) (rate(container_network_receive_bytes_total{namespace=~\"$namespace\"}[$__rate_interval]))",
"legendFormat": "{{namespace}} in"
},
{
"refId": "B",
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "-sum by (namespace) (rate(container_network_transmit_bytes_total{namespace=~\"$namespace\"}[$__rate_interval]))",
"legendFormat": "{{namespace}} out"
}
],
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"fieldConfig": {
"defaults": {
"unit": "Bps",
"custom": {
"fillOpacity": 10,
"showPoints": "never"
}
},
"overrides": []
}
}
],
"annotations": {
"list": []
}
}
@@ -1,8 +1,10 @@
apiVersion: kustomize.config.k8s.io/v1beta1 apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization kind: Kustomization
resources: resources:
- dashboard-application-logs.yaml
- dashboard-http-requests.yaml
- dashboard-raspberry-pi.yaml
- grafana-admin-sealedsecret.yaml - grafana-admin-sealedsecret.yaml
- grafana-db-sealedsecret.yaml - grafana-db-sealedsecret.yaml
- grafana-oidc-sealedsecret.yaml - grafana-oidc-sealedsecret.yaml
- httproute.yaml - httproute.yaml
- scrapeconfigs.yaml
@@ -1,59 +0,0 @@
# k3s control plane (bound in /etc/rancher/k3s/config.yaml); every endpoint also serves apiserver series.
apiVersion: monitoring.coreos.com/v1alpha1
kind: ScrapeConfig
metadata:
name: kube-controller-manager
namespace: monitoring
spec:
jobName: kube-controller-manager
scheme: HTTPS
tlsConfig:
insecureSkipVerify: true
authorization:
credentials:
name: kube-prometheus-stack-prometheus-token
key: token
staticConfigs:
- targets:
- 192.168.2.5:10257
metricRelabelings:
- action: drop
sourceLabels: [__name__]
regex: (apiserver|etcd|kine)_.*
---
apiVersion: monitoring.coreos.com/v1alpha1
kind: ScrapeConfig
metadata:
name: kube-scheduler
namespace: monitoring
spec:
jobName: kube-scheduler
scheme: HTTPS
tlsConfig:
insecureSkipVerify: true
authorization:
credentials:
name: kube-prometheus-stack-prometheus-token
key: token
staticConfigs:
- targets:
- 192.168.2.5:10259
metricRelabelings:
- action: drop
sourceLabels: [__name__]
regex: (apiserver|etcd|kine)_.*
---
apiVersion: monitoring.coreos.com/v1alpha1
kind: ScrapeConfig
metadata:
name: kube-proxy
namespace: monitoring
spec:
jobName: kube-proxy
staticConfigs:
- targets:
- 192.168.2.5:10249
metricRelabelings:
- action: drop
sourceLabels: [__name__]
regex: (apiserver|etcd|kine)_.*
+1 -3
View File
@@ -37,9 +37,7 @@ spec:
passwordSecret: passwordSecret:
name: redoost-db name: redoost-db
postgresql: postgresql:
# Each app role may only connect to the database of the same name. # Each app role may only connect to its own database; pgweb to all but authentik.
# pgweb is read-only and may browse every database except authentik's,
# which holds credentials and session tokens.
pg_hba: pg_hba:
- host sameuser all all scram-sha-256 - host sameuser all all scram-sha-256
- host authentik pgweb all reject - host authentik pgweb all reject
-2
View File
@@ -16,8 +16,6 @@ spec:
app.kubernetes.io/name: pgweb app.kubernetes.io/name: pgweb
spec: spec:
containers: containers:
# Only bookmarked databases can be connected to, picked on the
# connect screen; there is one bookmark per app database.
- args: - args:
- --bookmarks-dir=/bookmarks - --bookmarks-dir=/bookmarks
- --bookmarks-only - --bookmarks-only
+1 -2
View File
@@ -4,8 +4,7 @@ metadata:
name: pgweb name: pgweb
namespace: pgweb namespace: pgweb
spec: spec:
# Only traefik may reach pgweb, so authentik can't be bypassed from inside # Only traefik may reach pgweb, so authentik can't be bypassed.
# the cluster, and pgweb may only reach postgres.
egress: egress:
- ports: - ports:
- port: 53 - port: 53
+3 -9
View File
@@ -18,13 +18,11 @@ spec:
containers: containers:
- args: - args:
- | - |
# The image points iptables at the legacy backend, which the # The node's kernel only has nftables, the image defaults to legacy iptables.
# node's kernel doesn't have. Use nftables, as the node does.
for b in iptables iptables-save iptables-restore ip6tables ip6tables-save ip6tables-restore; do for b in iptables iptables-save iptables-restore ip6tables ip6tables-save ip6tables-restore; do
ln -sf xtables-nft-multi "/usr/sbin/$b" ln -sf xtables-nft-multi "/usr/sbin/$b"
done done
# Only used to skip the first-run setup; password login is # Only skips the setup wizard; password login is disabled.
# disabled in favour of authentik.
INIT_PASSWORD="$(head -c 32 /dev/urandom | od -An -tx1 | tr -d ' \n')" INIT_PASSWORD="$(head -c 32 /dev/urandom | od -An -tx1 | tr -d ' \n')"
export INIT_PASSWORD export INIT_PASSWORD
exec /usr/bin/dumb-init node server/index.mjs exec /usr/bin/dumb-init node server/index.mjs
@@ -83,11 +81,7 @@ spec:
initContainers: initContainers:
- args: - args:
- | - |
# Rules in the pod's own network namespace, never the node's. # VPN clients may reach the LAN, not this pod or the cluster networks.
# VPN clients may reach the home LAN, but not this pod (the web
# UI), the pod network or the service network. The mangle table
# runs before wg-easy's own filter rules, so its per-client
# firewall can't open these up.
set -eu set -eu
iptables-nft -t mangle -A PREROUTING -i wg0 -m addrtype --dst-type LOCAL -j DROP iptables-nft -t mangle -A PREROUTING -i wg0 -m addrtype --dst-type LOCAL -j DROP
iptables-nft -t mangle -A PREROUTING -i wg0 -d 10.42.0.0/16 -j DROP iptables-nft -t mangle -A PREROUTING -i wg0 -d 10.42.0.0/16 -j DROP
+43 -29
View File
@@ -17,35 +17,38 @@ spec:
values: | values: |
alertmanager: alertmanager:
enabled: false enabled: false
# Only node-exporter and cAdvisor are scraped.
defaultRules:
create: false
kubelet: kubelet:
serviceMonitor: serviceMonitor:
# The first rule is the chart's default, as lists are replaced; k3s also serves apiserver series here. interval: 60s
metricRelabelings: kubelet: false
- action: drop probes: false
sourceLabels: [__name__, le] cAdvisorMetricRelabelings:
regex: (csi_operations|storage_operation_duration)_seconds_bucket;(0.25|2.5|15|25|120|600)(\.0)? - action: keep
- action: drop
sourceLabels: [__name__] sourceLabels: [__name__]
regex: (apiserver|etcd|kine)_.* regex: container_(cpu_usage_seconds_total|memory_working_set_bytes|fs_(reads|writes)_bytes_total|network_(receive|transmit)_bytes_total)
# Scraped through ScrapeConfigs since ArgoCD ignores Endpoints; enabled for dashboards and rules. - action: drop
sourceLabels: [__name__, interface]
regex: container_network_.+;(br-|cni|docker|flannel|lo|tailscale|tun|veth|wg|wlan).*
- action: drop
sourceLabels: [id, pod]
regex: .+;
kubeApiServer:
enabled: false
kubeControllerManager: kubeControllerManager:
service: enabled: false
enabled: false
serviceMonitor:
enabled: false
kubeScheduler: kubeScheduler:
service: enabled: false
enabled: false
serviceMonitor:
enabled: false
kubeProxy: kubeProxy:
service: enabled: false
enabled: false
serviceMonitor:
enabled: false
# k3s runs on SQLite (kine), there is no etcd to scrape.
kubeEtcd: kubeEtcd:
enabled: false enabled: false
coreDns:
enabled: false
kubeStateMetrics:
enabled: false
prometheusOperator: prometheusOperator:
admissionWebhooks: admissionWebhooks:
certManager: certManager:
@@ -65,15 +68,15 @@ spec:
requests: requests:
cpu: 10m cpu: 10m
memory: 32Mi memory: 32Mi
kube-state-metrics: serviceMonitor:
resources: selfMonitor: false
limits:
cpu: 200m
memory: 256Mi
requests:
cpu: 20m
memory: 64Mi
prometheus-node-exporter: prometheus-node-exporter:
# The first two are the chart's defaults, as lists are replaced.
extraArgs:
- --collector.filesystem.mount-points-exclude=^/(dev|proc|sys|run/containerd/.+|var/lib/docker/.+|var/lib/kubelet/.+)($|/)
- --collector.filesystem.fs-types-exclude=^(autofs|binfmt_misc|bpf|cgroup2?|configfs|debugfs|devpts|devtmpfs|fusectl|hugetlbfs|iso9660|mqueue|nsfs|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|selinuxfs|squashfs|sysfs|tracefs|erofs)$
- --collector.netclass.ignored-devices=^(veth.*|br-.*|docker0|cni0|lo)$
- --collector.netdev.device-exclude=^(veth.*|br-.*|docker0|cni0|lo)$
resources: resources:
limits: limits:
cpu: 200m cpu: 200m
@@ -82,7 +85,10 @@ spec:
cpu: 20m cpu: 20m
memory: 32Mi memory: 32Mi
prometheus: prometheus:
serviceMonitor:
selfMonitor: false
prometheusSpec: prometheusSpec:
scrapeInterval: 60s
retention: 90d retention: 90d
retentionSize: 45GB retentionSize: 45GB
# Pick up monitors and rules from every namespace, not just this release. # Pick up monitors and rules from every namespace, not just this release.
@@ -114,6 +120,8 @@ spec:
type: loki type: loki
uid: loki uid: loki
url: http://loki.monitoring.svc.cluster.local:3100 url: http://loki.monitoring.svc.cluster.local:3100
isDefault: true
defaultDashboardsEnabled: false
envValueFrom: envValueFrom:
GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET: GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET:
secretKeyRef: secretKeyRef:
@@ -155,7 +163,13 @@ spec:
requests: requests:
cpu: 50m cpu: 50m
memory: 256Mi memory: 256Mi
serviceMonitor:
enabled: false
sidecar: sidecar:
datasources:
alertmanager:
enabled: false
isDefaultDatasource: false
dashboards: dashboards:
searchNamespace: ALL searchNamespace: ALL
resources: resources:
+7
View File
@@ -15,6 +15,13 @@ spec:
- chart: traefik - chart: traefik
helm: helm:
values: | values: |
# Query strings are dropped, as OAuth callbacks carry codes.
accessLog:
enabled: true
format: json
fields:
queryParameters:
defaultMode: drop
ingressClass: ingressClass:
enabled: false enabled: false
providers: providers: