Compare commits

...

22 Commits

Author SHA1 Message Date
8f56c8b174 temporary kubernaut concurrency test 2025-07-15 11:27:02 -05:00
b087336749 use Loki gateway pod 2025-07-14 12:57:41 -05:00
9106f3bd8b forward Kubernetes system logs to Loki with Alloy 2025-07-14 12:37:06 -05:00
fb8942479f forward Kubernetes events to Loki with Alloy 2025-07-14 12:11:49 -05:00
5b5c4e4064 remove inert Helm parameters 2025-07-13 13:20:53 -05:00
da6ead588b change Grafana Service type to LoadBalancer 2025-07-13 13:20:53 -05:00
58636420b5 add alloy 2025-07-12 20:50:57 -05:00
cef6264d97 add loki 2025-07-12 09:52:00 -05:00
b04fc787a0 add kubernaut resources limits 2025-07-11 02:13:15 -05:00
f403fa51aa add kubernaut ScaledObject, remove HPA 2025-07-10 19:57:59 -05:00
aad72215c3 add kubernaut ServiceMonitor 2025-07-09 21:04:59 -05:00
f48135742d add kubernaut labels 2025-07-09 15:22:59 -05:00
b1ec9ee459 kubernaut v0.2.4 2025-07-09 12:08:21 -05:00
e026c0b314 add Keda 2025-07-08 21:34:57 -05:00
39b3892433 add kube-prometheus-stack 2025-07-08 14:18:39 -05:00
f044cb2069 add local-path-provisioner 2025-07-08 14:18:39 -05:00
ba40554d1e add argo-workflows 2025-07-08 14:18:39 -05:00
7eddba6df7 add argo-rollouts 2025-07-08 14:18:39 -05:00
2ebbfa5a2e add HAProxy 2025-07-08 14:18:39 -05:00
40e2bd1f6d traefik 36.3.0 2025-07-08 14:18:39 -05:00
0ddb453a02 add ingress-nginx Helm value files 2025-07-08 14:18:39 -05:00
8f5881c57a use Helm for metrics-server 2025-07-02 14:55:54 -05:00
36 changed files with 679 additions and 44 deletions

9
alloy/Chart.yaml Normal file
View File

@@ -0,0 +1,9 @@
---
apiVersion: v2
name: alloy
version: "1.0.0"
dependencies:
- name: alloy
version: 1.1.2
repository: https://grafana.github.io/helm-charts

View File

@@ -0,0 +1,143 @@
alloy:
alloy:
configMap:
content: |-
loki.write "default" {
endpoint {
url = "http://loki-gateway.loki.svc.cluster.local/loki/api/v1/push"
tenant_id = "luna"
}
}
// local.file_match discovers files on the local filesystem using glob patterns and the doublestar library. It returns an array of file paths.
local.file_match "node_logs" {
path_targets = [{
// Monitor syslog to scrape node-logs
__path__ = "/var/log/messages",
job = "node/syslog",
node_name = sys.env("HOSTNAME"),
cluster = "development",
}]
}
// loki.source.file reads log entries from files and forwards them to other loki.* components.
// You can specify multiple loki.source.file components by giving them different labels.
loki.source.file "node_logs" {
targets = local.file_match.node_logs.targets
forward_to = [loki.write.default.receiver]
}
// discovery.kubernetes allows you to find scrape targets from Kubernetes resources.
// It watches cluster state and ensures targets are continually synced with what is currently running in your cluster.
discovery.kubernetes "pod" {
role = "pod"
}
// discovery.relabel rewrites the label set of the input targets by applying one or more relabeling rules.
// If no rules are defined, then the input targets are exported as-is.
discovery.relabel "pod_logs" {
targets = discovery.kubernetes.pod.targets
// Label creation - "namespace" field from "__meta_kubernetes_namespace"
rule {
source_labels = ["__meta_kubernetes_namespace"]
action = "replace"
target_label = "namespace"
}
// Label creation - "pod" field from "__meta_kubernetes_pod_name"
rule {
source_labels = ["__meta_kubernetes_pod_name"]
action = "replace"
target_label = "pod"
}
// Label creation - "container" field from "__meta_kubernetes_pod_container_name"
rule {
source_labels = ["__meta_kubernetes_pod_container_name"]
action = "replace"
target_label = "container"
}
// Label creation - "app" field from "__meta_kubernetes_pod_label_app_kubernetes_io_name"
rule {
source_labels = ["__meta_kubernetes_pod_label_app_kubernetes_io_name"]
action = "replace"
target_label = "app"
}
// Label creation - "job" field from "__meta_kubernetes_namespace" and "__meta_kubernetes_pod_container_name"
// Concatenate values __meta_kubernetes_namespace/__meta_kubernetes_pod_container_name
rule {
source_labels = ["__meta_kubernetes_namespace", "__meta_kubernetes_pod_container_name"]
action = "replace"
target_label = "job"
separator = "/"
replacement = "$1"
}
// Label creation - "container" field from "__meta_kubernetes_pod_uid" and "__meta_kubernetes_pod_container_name"
// Concatenate values __meta_kubernetes_pod_uid/__meta_kubernetes_pod_container_name.log
rule {
source_labels = ["__meta_kubernetes_pod_uid", "__meta_kubernetes_pod_container_name"]
action = "replace"
target_label = "__path__"
separator = "/"
replacement = "/var/log/pods/*$1/*.log"
}
// Label creation - "container_runtime" field from "__meta_kubernetes_pod_container_id"
rule {
source_labels = ["__meta_kubernetes_pod_container_id"]
action = "replace"
target_label = "container_runtime"
regex = "^(\\S+):\\/\\/.+$"
replacement = "$1"
}
}
// loki.source.kubernetes tails logs from Kubernetes containers using the Kubernetes API.
loki.source.kubernetes "pod_logs" {
targets = discovery.relabel.pod_logs.output
forward_to = [loki.process.pod_logs.receiver]
}
// loki.process receives log entries from other Loki components, applies one or more processing stages,
// and forwards the results to the list of receivers in the component's arguments.
loki.process "pod_logs" {
stage.static_labels {
values = {
cluster = "development",
}
}
forward_to = [loki.write.default.receiver]
}
// loki.source.kubernetes_events tails events from the Kubernetes API and converts them
// into log lines to forward to other Loki components.
loki.source.kubernetes_events "cluster_events" {
job_name = "integrations/kubernetes/eventhandler"
log_format = "logfmt"
forward_to = [
loki.process.cluster_events.receiver,
]
}
// loki.process receives log entries from other loki components, applies one or more processing stages,
// and forwards the results to the list of receivers in the component's arguments.
loki.process "cluster_events" {
forward_to = [loki.write.default.receiver]
stage.static_labels {
values = {
cluster = "development",
}
}
stage.labels {
values = {
kubernetes_cluster_events = "job",
}
}
}

40
apps/alloy.yaml Normal file
View File

@@ -0,0 +1,40 @@
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: alloy
spec:
goTemplate: true
goTemplateOptions: ["missingkey=error"]
generators:
- list:
elements:
- cluster: production
url: https://kubernetes.default.svc
- cluster: staging
url: https://k3s-ctrl-lb.lab.kill0.net:6443
- cluster: development
url: https://k0s-ctrl-vip.lab.kill0.net:6443
template:
metadata:
name: 'alloy-{{.cluster}}'
spec:
project: default
source:
path: alloy
repoURL: https://git.kill0.net/ryanc/argocd.git
targetRevision: HEAD
helm:
releaseName: alloy
valueFiles:
- values.yaml
- values-{{.cluster}}.yaml
ignoreMissingValueFiles: true
destination:
server: '{{.url}}'
namespace: alloy
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true

34
apps/argo-rollouts.yaml Normal file
View File

@@ -0,0 +1,34 @@
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: argo-rollouts
spec:
goTemplate: true
goTemplateOptions: ["missingkey=error"]
generators:
- list:
elements:
- cluster: production
url: https://kubernetes.default.svc
- cluster: staging
url: https://k3s-ctrl-lb.lab.kill0.net:6443
- cluster: development
url: https://k0s-ctrl-vip.lab.kill0.net:6443
template:
metadata:
name: 'argo-rollouts-{{.cluster}}'
spec:
project: default
source:
repoURL: https://git.kill0.net/ryanc/argocd.git
targetRevision: HEAD
path: argo-rollouts
destination:
server: '{{.url}}'
namespace: argo-rollouts
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true

34
apps/argo-workflows.yaml Normal file
View File

@@ -0,0 +1,34 @@
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: argo-workflows
spec:
goTemplate: true
goTemplateOptions: ["missingkey=error"]
generators:
- list:
elements:
- cluster: production
url: https://kubernetes.default.svc
- cluster: staging
url: https://k3s-ctrl-lb.lab.kill0.net:6443
- cluster: development
url: https://k0s-ctrl-vip.lab.kill0.net:6443
template:
metadata:
name: 'argo-workflows-{{.cluster}}'
spec:
project: default
source:
repoURL: https://git.kill0.net/ryanc/argocd.git
targetRevision: HEAD
path: argo-workflows
destination:
server: '{{.url}}'
namespace: argo
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true

40
apps/haproxy.yaml Normal file
View File

@@ -0,0 +1,40 @@
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: haproxy-kubernetes-ingress
spec:
goTemplate: true
goTemplateOptions: ["missingkey=error"]
generators:
- list:
elements:
- cluster: production
url: https://kubernetes.default.svc
- cluster: staging
url: https://k3s-ctrl-lb.lab.kill0.net:6443
- cluster: development
url: https://k0s-ctrl-vip.lab.kill0.net:6443
template:
metadata:
name: 'haproxy-kubernetes-ingress-{{.cluster}}'
spec:
project: default
source:
path: haproxy-kubernetes-ingress
repoURL: https://git.kill0.net/ryanc/argocd.git
targetRevision: HEAD
helm:
releaseName: haproxy-kubernetes-ingress
valueFiles:
- values.yaml
- values-{{.cluster}}.yaml
ignoreMissingValueFiles: true
destination:
server: '{{.url}}'
namespace: haproxy-controller
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true

View File

@@ -23,11 +23,15 @@ spec:
spec:
project: default
source:
chart: ingress-nginx
repoURL: https://kubernetes.github.io/ingress-nginx
targetRevision: '{{.chart}}'
path: ingress-nginx
repoURL: https://git.kill0.net/ryanc/argocd.git
targetRevision: HEAD
helm:
releaseName: ingress-nginx
valueFiles:
- values.yaml
- values-{{.cluster}}.yaml
ignoreMissingValueFiles: true
destination:
server: '{{.url}}'
namespace: ingress-nginx

41
apps/keda.yaml Normal file
View File

@@ -0,0 +1,41 @@
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: keda
spec:
goTemplate: true
goTemplateOptions: ["missingkey=error"]
generators:
- list:
elements:
- cluster: production
url: https://kubernetes.default.svc
- cluster: staging
url: https://k3s-ctrl-lb.lab.kill0.net:6443
- cluster: development
url: https://k0s-ctrl-vip.lab.kill0.net:6443
template:
metadata:
name: 'keda-{{.cluster}}'
spec:
project: default
source:
path: keda
repoURL: https://git.kill0.net/ryanc/argocd.git
targetRevision: HEAD
helm:
releaseName: keda
valueFiles:
- values.yaml
- values-{{.cluster}}.yaml
ignoreMissingValueFiles: true
destination:
server: '{{.url}}'
namespace: keda
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
- ServerSideApply=true

View File

@@ -0,0 +1,41 @@
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: kube-prometheus-stack
spec:
goTemplate: true
goTemplateOptions: ["missingkey=error"]
generators:
- list:
elements:
- cluster: production
url: https://kubernetes.default.svc
- cluster: staging
url: https://k3s-ctrl-lb.lab.kill0.net:6443
- cluster: development
url: https://k0s-ctrl-vip.lab.kill0.net:6443
template:
metadata:
name: 'kube-prometheus-stack-{{.cluster}}'
spec:
project: default
source:
path: kube-prometheus-stack
repoURL: https://git.kill0.net/ryanc/argocd.git
targetRevision: HEAD
helm:
releaseName: kube-prometheus-stack
valueFiles:
- values.yaml
- values-{{.cluster}}.yaml
ignoreMissingValueFiles: true
destination:
server: '{{.url}}'
namespace: kube-prometheus-stack
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
- ServerSideApply=true

View File

@@ -0,0 +1,33 @@
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: local-path-provisioner
spec:
goTemplate: true
goTemplateOptions: ["missingkey=error"]
generators:
- list:
elements:
- cluster: production
url: https://kubernetes.default.svc
- cluster: staging
url: https://k3s-ctrl-lb.lab.kill0.net:6443
- cluster: development
url: https://k0s-ctrl-vip.lab.kill0.net:6443
template:
metadata:
name: 'local-path-provisioner-{{.cluster}}'
spec:
project: default
source:
repoURL: https://git.kill0.net/ryanc/argocd.git
targetRevision: HEAD
path: local-path-provisioner
destination:
server: '{{.url}}'
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true

40
apps/loki.yaml Normal file
View File

@@ -0,0 +1,40 @@
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: loki
spec:
goTemplate: true
goTemplateOptions: ["missingkey=error"]
generators:
- list:
elements:
- cluster: production
url: https://kubernetes.default.svc
- cluster: staging
url: https://k3s-ctrl-lb.lab.kill0.net:6443
- cluster: development
url: https://k0s-ctrl-vip.lab.kill0.net:6443
template:
metadata:
name: 'loki-{{.cluster}}'
spec:
project: default
source:
path: loki
repoURL: https://git.kill0.net/ryanc/argocd.git
targetRevision: HEAD
helm:
releaseName: loki
valueFiles:
- values.yaml
- values-{{.cluster}}.yaml
ignoreMissingValueFiles: true
destination:
server: '{{.url}}'
namespace: loki
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true

52
apps/metrics-server.yaml Normal file
View File

@@ -0,0 +1,52 @@
---
apiVersion: v1
stringData:
name: metrics-server
project: default
proxy: http://proxy-lb.lab.kill0.net:3128
type: helm
url: https://kubernetes-sigs.github.io/metrics-server
kind: Secret
metadata:
labels:
argocd.argoproj.io/secret-type: repository
name: repo-metrics-server
namespace: argocd
type: Opaque
---
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: metrics-server
spec:
goTemplate: true
goTemplateOptions: ["missingkey=error"]
generators:
- list:
elements:
- cluster: production
url: https://kubernetes.default.svc
chart: &version 3.12.2
- cluster: staging
url: https://k3s-ctrl-lb.lab.kill0.net:6443
chart: *version
- cluster: development
url: https://k0s-ctrl-vip.lab.kill0.net:6443
chart: *version
template:
metadata:
name: 'metrics-server-{{.cluster}}'
spec:
project: default
source:
chart: metrics-server
repoURL: https://kubernetes-sigs.github.io/metrics-server
targetRevision: '{{.chart}}'
helm:
releaseName: metrics-server
destination:
server: '{{.url}}'
syncPolicy:
automated:
prune: true
selfHeal: true

View File

@@ -10,13 +10,13 @@ spec:
elements:
- cluster: production
url: https://kubernetes.default.svc
chart: 36.2.0
chart: 36.3.0
- cluster: staging
url: https://k3s-ctrl-lb.lab.kill0.net:6443
chart: 36.2.0
chart: 36.3.0
- cluster: development
url: https://k0s-ctrl-vip.lab.kill0.net:6443
chart: 36.2.0
chart: 36.3.0
template:
metadata:
name: 'traefik-{{.cluster}}'

View File

@@ -0,0 +1,4 @@
---
resources:
- github.com/argoproj/argo-rollouts//manifests/cluster-install?ref=v1.8.3
- github.com/argoproj/argo-rollouts//manifests/dashboard-install?ref=v1.8.3

View File

@@ -0,0 +1,3 @@
---
resources:
- github.com/argoproj/argo-workflows//manifests/cluster-install?ref=v3.6.10

View File

@@ -0,0 +1,9 @@
---
apiVersion: v2
name: haproxy-kubernetes-ingress
version: "1.0.0"
dependencies:
- name: kubernetes-ingress
version: 1.24.0
repository: https://haproxytech.github.io/helm-charts

9
ingress-nginx/Chart.yaml Normal file
View File

@@ -0,0 +1,9 @@
---
apiVersion: v2
name: ingress-nginx
version: "1.0.0"
dependencies:
- name: ingress-nginx
version: 4.12.3
repository: https://kubernetes.github.io/ingress-nginx

View File

@@ -0,0 +1,5 @@
---
ingress-nginx:
controller:
addHeaders:
x-fart: pooooot

View File

@@ -0,0 +1,5 @@
---
ingress-nginx:
controller:
addHeaders:
x-fart: frrrrrp

View File

@@ -0,0 +1 @@
---

9
keda/Chart.yaml Normal file
View File

@@ -0,0 +1,9 @@
---
apiVersion: v2
name: keda
version: "1.0.0"
dependencies:
- name: keda
version: 2.17.2
repository: https://kedacore.github.io/charts

View File

@@ -0,0 +1,9 @@
---
apiVersion: v2
name: kube-prometheus-stack
version: "1.0.0"
dependencies:
- name: kube-prometheus-stack
version: 75.9.0
repository: https://prometheus-community.github.io/helm-charts

View File

@@ -0,0 +1,4 @@
kube-prometheus-stack:
grafana:
service:
type: LoadBalancer

View File

@@ -6,3 +6,4 @@ metadata:
namespace: kubernaut
data:
KUBERNAUT_CAT: kilwin
WEB_CONCURRENCY: "4"

View File

@@ -5,6 +5,8 @@ metadata:
name: kubernaut
annotations:
reloader.stakater.com/auto: "true"
labels:
app: kubernaut
spec:
selector:
matchLabels:
@@ -16,7 +18,7 @@ spec:
spec:
containers:
- name: kubernaut
image: git.kill0.net/ryanc/kubernaut:0.2.3
image: git.kill0.net/ryanc/kubernaut:0.2.4
imagePullPolicy: IfNotPresent
ports:
- name: sinatra-web

View File

@@ -6,7 +6,9 @@ resources:
- namespace.yaml
- configmap.yaml
- deployment.yaml
- hpa.yaml
# - hpa.yaml
- services.yaml
- servicemonitor.yaml
- scaledobject.yaml
- cronjob.yaml
- ingress.yaml

View File

@@ -0,0 +1,16 @@
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: kubernaut-scaledobject
spec:
scaleTargetRef:
name: kubernaut
minReplicaCount: 1
maxReplicaCount: 10
triggers:
- type: prometheus
metadata:
serverAddress: http://kube-prometheus-stack-prometheus.kube-prometheus-stack:9090
metricName: http_server_requests_total
threshold: '50'
query: sum(rate(http_server_requests_total[1m]))

View File

@@ -0,0 +1,12 @@
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: kubernaut
labels:
release: kube-prometheus-stack
spec:
selector:
matchLabels:
app: kubernaut
endpoints:
- port: web

View File

@@ -3,6 +3,8 @@ apiVersion: v1
kind: Service
metadata:
name: kubernaut
labels:
app: kubernaut
spec:
ports:
- name: web

View File

@@ -1,11 +0,0 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubernaut
spec:
template:
spec:
containers:
- name: kubernaut
image: git.kill0.net/ryanc/kubernaut:0.2.3

View File

@@ -1,11 +0,0 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubernaut
spec:
template:
spec:
containers:
- name: kubernaut
image: git.kill0.net/ryanc/kubernaut:0.2.2

View File

@@ -1,11 +0,0 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubernaut
spec:
template:
spec:
containers:
- name: kubernaut
image: git.kill0.net/ryanc/kubernaut:0.2.3

View File

@@ -0,0 +1,3 @@
---
resources:
- github.com/rancher/local-path-provisioner//deploy?ref=v0.0.31

9
loki/Chart.yaml Normal file
View File

@@ -0,0 +1,9 @@
---
apiVersion: v2
name: loki
version: "1.0.0"
dependencies:
- name: loki
version: 6.31.0
repository: https://grafana.github.io/helm-charts

View File

@@ -0,0 +1,55 @@
loki:
loki:
commonConfig:
replication_factor: 1
schemaConfig:
configs:
- from: "2024-04-01"
store: tsdb
object_store: s3
schema: v13
index:
prefix: loki_index_
period: 24h
pattern_ingester:
enabled: true
limits_config:
allow_structured_metadata: true
volume_enabled: true
ruler:
enable_api: true
minio:
enabled: true
deploymentMode: SingleBinary
singleBinary:
replicas: 1
# Zero out replica counts of other deployment modes
backend:
replicas: 0
read:
replicas: 0
write:
replicas: 0
ingester:
replicas: 0
querier:
replicas: 0
queryFrontend:
replicas: 0
queryScheduler:
replicas: 0
distributor:
replicas: 0
compactor:
replicas: 0
indexGateway:
replicas: 0
bloomCompactor:
replicas: 0
bloomGateway:
replicas: 0

View File

@@ -1,3 +0,0 @@
---
resources:
- https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.7.2/components.yaml