diff --git a/apps/authentik/dependencies.yaml b/apps/authentik/dependencies.yaml index ea5bab3..e84cb48 100644 --- a/apps/authentik/dependencies.yaml +++ b/apps/authentik/dependencies.yaml @@ -1,11 +1,17 @@ --- # REDIS +# HINWEIS: +# - Redis nutzt ein Longhorn-Volume (PVC) für Persistenz. +# - Repliken = 1 bedeutet: Kein echtes Redis-HA, aber Daten überleben Node-/Pod-Neustarts. +# - Für echtes Redis-HA (Multi-Node) brauchst du später Redis Sentinel / Redis Operator +# oder ein externes/managed Redis. apiVersion: apps/v1 -kind: Deployment +kind: StatefulSet metadata: name: authentik-redis namespace: authentik spec: + serviceName: authentik-redis replicas: 1 selector: matchLabels: @@ -31,6 +37,18 @@ spec: requests: cpu: 50m memory: 128Mi + volumeMounts: + - name: redis-data + mountPath: /data + volumeClaimTemplates: + - metadata: + name: redis-data + spec: + accessModes: ["ReadWriteOnce"] + storageClassName: longhorn + resources: + requests: + storage: 2Gi --- apiVersion: v1 kind: Service @@ -84,6 +102,7 @@ spec: name: postgres-data spec: accessModes: [ "ReadWriteOnce" ] + storageClassName: longhorn resources: requests: storage: 5Gi diff --git a/apps/outline/dependencies.yaml b/apps/outline/dependencies.yaml index 7bd795a..5952398 100644 --- a/apps/outline/dependencies.yaml +++ b/apps/outline/dependencies.yaml @@ -1,14 +1,18 @@ --- # REDIS -# HINWEIS: Redis HA (Sentinel) wäre besser, aber 1 Replica ist OK für Cache -# Wenn Redis ausfällt, funktioniert Outline noch (nur Features eingeschränkt) +# HINWEIS: +# - Redis wird hier auf einem PersistentVolume (Longhorn) betrieben. +# - Repliken = 1 bedeutet: Kein echtes Redis-HA, aber Daten überleben Node-/Pod-Neustarts. +# - Für echtes Redis-HA (Multi-Node-Failover) brauchst du später Redis Sentinel / Redis Operator +# oder ein extern verwaltetes Redis (Managed DB). apiVersion: apps/v1 -kind: Deployment +kind: StatefulSet metadata: name: outline-redis namespace: outline spec: - replicas: 1 # HA: Optional auf Redis Sentinel upgraden + serviceName: outline-redis + replicas: 1 # Für echtes HA später Redis Sentinel/Cluster einsetzen selector: matchLabels: app: outline-redis @@ -29,6 +33,18 @@ spec: secretKeyRef: name: outline-secrets key: redis-password + volumeMounts: + - name: redis-data + mountPath: /data + volumeClaimTemplates: + - metadata: + name: redis-data + spec: + accessModes: ["ReadWriteOnce"] + storageClassName: longhorn + resources: + requests: + storage: 2Gi --- apiVersion: v1 kind: Service @@ -85,6 +101,7 @@ spec: name: postgres-data spec: accessModes: [ "ReadWriteOnce" ] + storageClassName: longhorn resources: requests: storage: 5Gi diff --git a/infrastructure/traefik-app.yaml b/infrastructure/traefik-app.yaml index ab096b3..20c5919 100644 --- a/infrastructure/traefik-app.yaml +++ b/infrastructure/traefik-app.yaml @@ -14,19 +14,19 @@ spec: helm: values: | deployment: - replicas: 3 # HA: Einer pro Node + # Traefik als DaemonSet, damit auf jedem Node ein Pod läuft + kind: DaemonSet # WICHTIG: affinity muss auf oberster Ebene stehen, NICHT unter deployment! affinity: podAntiAffinity: - # WICHTIG: requiredDuringSchedulingIgnoredDuringExecution = Hard Rule - # Verhindert, dass Pods auf dem gleichen Node laufen - # Nur app.kubernetes.io/name verwenden (ohne instance), damit die Regel - # mit allen Traefik-Pods funktioniert (auch bei Deployment-Updates) - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchLabels: - app.kubernetes.io/name: traefik - topologyKey: kubernetes.io/hostname + # Soft Anti-Affinity: verteilt Pods auf verschiedene Nodes, blockiert aber nicht hart + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchLabels: + app.kubernetes.io/name: traefik + topologyKey: kubernetes.io/hostname service: enabled: true type: LoadBalancer