onedr0p / home-ops

Wife approved HomeOps driven by Kubernetes and GitOps using Flux
https://onedr0p.github.io/home-ops/
Do What The F*ck You Want To Public License
1.98k stars 179 forks source link

feat: add limitarr #8157

Closed onedr0p closed 1 week ago

onedr0p commented 1 week ago

This limits bandwidth when sab and qb both have items in the queue to LIMIT_PERCENTAGE and then reverts each to MAX_PERCENTAGE when not.

Finally Sab and Qb can coexist peacefully with using https://github.com/onedr0p/kubanetics/blob/main/scripts/bandwidth-limiter.py

bot-ross[bot] commented 1 week ago
--- kubernetes/main/apps Kustomization: flux-system/cluster-apps Kustomization: flux-system/limitarr

+++ kubernetes/main/apps Kustomization: flux-system/cluster-apps Kustomization: flux-system/limitarr

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

+---
+apiVersion: kustomize.toolkit.fluxcd.io/v1
+kind: Kustomization
+metadata:
+  labels:
+    kustomize.toolkit.fluxcd.io/name: cluster-apps
+    kustomize.toolkit.fluxcd.io/namespace: flux-system
+  name: limitarr
+  namespace: flux-system
+spec:
+  commonMetadata:
+    labels:
+      app.kubernetes.io/name: limitarr
+  decryption:
+    provider: sops
+    secretRef:
+      name: sops-age
+  dependsOn:
+  - name: external-secrets-stores
+  interval: 30m
+  path: ./kubernetes/main/apps/default/limitarr/app
+  postBuild:
+    substituteFrom:
+    - kind: ConfigMap
+      name: cluster-settings
+    - kind: Secret
+      name: cluster-secrets
+  prune: true
+  retryInterval: 1m
+  sourceRef:
+    kind: GitRepository
+    name: home-kubernetes
+  targetNamespace: default
+  timeout: 5m
+  wait: false
+
--- kubernetes/main/apps/default/limitarr/app Kustomization: flux-system/limitarr ExternalSecret: default/limitarr

+++ kubernetes/main/apps/default/limitarr/app Kustomization: flux-system/limitarr ExternalSecret: default/limitarr

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

+---
+apiVersion: external-secrets.io/v1beta1
+kind: ExternalSecret
+metadata:
+  labels:
+    app.kubernetes.io/name: limitarr
+    kustomize.toolkit.fluxcd.io/name: limitarr
+    kustomize.toolkit.fluxcd.io/namespace: flux-system
+  name: limitarr
+  namespace: default
+spec:
+  dataFrom:
+  - extract:
+      key: sabnzbd
+  secretStoreRef:
+    kind: ClusterSecretStore
+    name: onepassword-connect
+  target:
+    name: limitarr-secret
+    template:
+      data:
+        SABNZBD_API_KEY: '{{ .SABNZBD_API_KEY }}'
+      engineVersion: v2
+
--- kubernetes/main/apps/default/limitarr/app Kustomization: flux-system/limitarr HelmRelease: default/limitarr

+++ kubernetes/main/apps/default/limitarr/app Kustomization: flux-system/limitarr HelmRelease: default/limitarr

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

+---
+apiVersion: helm.toolkit.fluxcd.io/v2
+kind: HelmRelease
+metadata:
+  labels:
+    app.kubernetes.io/name: limitarr
+    kustomize.toolkit.fluxcd.io/name: limitarr
+    kustomize.toolkit.fluxcd.io/namespace: flux-system
+  name: limitarr
+  namespace: default
+spec:
+  chart:
+    spec:
+      chart: app-template
+      sourceRef:
+        kind: HelmRepository
+        name: bjw-s
+        namespace: flux-system
+      version: 3.4.0
+  dependsOn:
+  - name: qbittorrent
+    namespace: default
+  - name: sabnzbd
+    namespace: default
+  install:
+    remediation:
+      retries: 3
+  interval: 30m
+  upgrade:
+    cleanupOnFail: true
+    remediation:
+      retries: 3
+      strategy: rollback
+  values:
+    controllers:
+      limitarr:
+        annotations:
+          reloader.stakater.com/auto: 'true'
+        containers:
+          app:
+            env:
+              INTERVAL: '5'
+              LIMIT_PERCENTAGE: '0.40'
+              LOG_LEVEL: INFO
+              MAX_LINE_SPEED_MBPS: '100'
+              MAX_PERCENTAGE: '0.80'
+              QBITTORRENT_URL: http://qbittorrent.default.svc.cluster.local
+              SABNZBD_URL: http://sabnzbd.default.svc.cluster.local
+              SCRIPT_NAME: bandwidth-limiter.py
+            envFrom:
+            - secretRef:
+                name: limitarr-secret
+            image:
+              repository: ghcr.io/onedr0p/kubanetics
+              tag: 2024.10.1@sha256:ac1df568e6530f0317e42ea80c97b632b14fe34b84cf79d56f881c07361fd464
+            resources:
+              limits:
+                memory: 64Mi
+              requests:
+                cpu: 10m
+            securityContext:
+              allowPrivilegeEscalation: false
+              capabilities:
+                drop:
+                - ALL
+              readOnlyRootFilesystem: true
+    defaultPodOptions:
+      securityContext:
+        runAsGroup: 65534
+        runAsNonRoot: true
+        runAsUser: 65534
+        seccompProfile:
+          type: RuntimeDefault
+
bot-ross[bot] commented 1 week ago
--- HelmRelease: default/limitarr Deployment: default/limitarr

+++ HelmRelease: default/limitarr Deployment: default/limitarr

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

+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: limitarr
+  labels:
+    app.kubernetes.io/component: limitarr
+    app.kubernetes.io/instance: limitarr
+    app.kubernetes.io/managed-by: Helm
+    app.kubernetes.io/name: limitarr
+  annotations:
+    reloader.stakater.com/auto: 'true'
+spec:
+  revisionHistoryLimit: 3
+  replicas: 1
+  strategy:
+    type: Recreate
+  selector:
+    matchLabels:
+      app.kubernetes.io/component: limitarr
+      app.kubernetes.io/name: limitarr
+      app.kubernetes.io/instance: limitarr
+  template:
+    metadata:
+      labels:
+        app.kubernetes.io/component: limitarr
+        app.kubernetes.io/instance: limitarr
+        app.kubernetes.io/name: limitarr
+    spec:
+      enableServiceLinks: false
+      serviceAccountName: default
+      automountServiceAccountToken: true
+      securityContext:
+        runAsGroup: 65534
+        runAsNonRoot: true
+        runAsUser: 65534
+        seccompProfile:
+          type: RuntimeDefault
+      hostIPC: false
+      hostNetwork: false
+      hostPID: false
+      dnsPolicy: ClusterFirst
+      containers:
+      - env:
+        - name: INTERVAL
+          value: '5'
+        - name: LIMIT_PERCENTAGE
+          value: '0.40'
+        - name: LOG_LEVEL
+          value: INFO
+        - name: MAX_LINE_SPEED_MBPS
+          value: '100'
+        - name: MAX_PERCENTAGE
+          value: '0.80'
+        - name: QBITTORRENT_URL
+          value: http://qbittorrent.default.svc.cluster.local
+        - name: SABNZBD_URL
+          value: http://sabnzbd.default.svc.cluster.local
+        - name: SCRIPT_NAME
+          value: bandwidth-limiter.py
+        envFrom:
+        - secretRef:
+            name: limitarr-secret
+        image: ghcr.io/onedr0p/kubanetics:2024.10.1@sha256:ac1df568e6530f0317e42ea80c97b632b14fe34b84cf79d56f881c07361fd464
+        name: app
+        resources:
+          limits:
+            memory: 64Mi
+          requests:
+            cpu: 10m
+        securityContext:
+          allowPrivilegeEscalation: false
+          capabilities:
+            drop:
+            - ALL
+          readOnlyRootFilesystem: true
+