--- # Namespace (trust zone; default-deny + policies apply) apiVersion: v1 kind: Namespace metadata: name: radarr labels: homelab.keithjackson.dev/app-namespace: 'true' gateway-access: shared annotations: homelab.keithjackson.dev/backup-policy: daily-offcluster --- # Default-deny baseline (R-NET-01): deny all, allow only DNS apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny namespace: radarr labels: homelab.keithjackson.dev/baseline: default-deny spec: podSelector: {} policyTypes: - Ingress - Egress ingress: [] egress: - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system ports: - protocol: UDP port: 53 - protocol: TCP port: 53 --- # PVC radarr-config (R-STATE) apiVersion: v1 kind: PersistentVolumeClaim metadata: name: radarr-config namespace: radarr labels: app.kubernetes.io/name: radarr spec: accessModes: - ReadWriteOnce storageClassName: longhorn resources: requests: storage: 5Gi --- # Deployment (R-PLAT-02) apiVersion: apps/v1 kind: Deployment metadata: name: radarr namespace: radarr labels: app.kubernetes.io/name: radarr spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: radarr template: metadata: labels: app.kubernetes.io/name: radarr homelab.keithjackson.dev/egress-class: vpn homelab.keithjackson.dev/auth-mode: forward-auth annotations: homelab.keithjackson.dev/auth-mode: forward-auth homelab.keithjackson.dev/auth-groups: media-users spec: containers: - name: radarr image: lscr.io/linuxserver/radarr:5.21.1 ports: - containerPort: 7878 volumeMounts: - name: config mountPath: /data/config volumes: - name: config persistentVolumeClaim: claimName: radarr-config --- # Service apiVersion: v1 kind: Service metadata: name: radarr namespace: radarr labels: app.kubernetes.io/name: radarr spec: selector: app.kubernetes.io/name: radarr ports: - name: port-7878 port: 7878 targetPort: 7878 --- # CiliumNetworkPolicy egress allow (R-NET-02): radarr-allow-qbittorrent-8080 apiVersion: cilium.io/v2 kind: CiliumNetworkPolicy metadata: name: radarr-allow-qbittorrent-8080 namespace: radarr labels: app.kubernetes.io/name: radarr spec: endpointSelector: matchLabels: app.kubernetes.io/name: radarr egress: - toEndpoints: - matchLabels: app.kubernetes.io/name: qbittorrent toPorts: - ports: - port: '8080' protocol: TCP --- # CiliumNetworkPolicy egress allow (R-NET-02): radarr-allow-jackett-9117 apiVersion: cilium.io/v2 kind: CiliumNetworkPolicy metadata: name: radarr-allow-jackett-9117 namespace: radarr labels: app.kubernetes.io/name: radarr spec: endpointSelector: matchLabels: app.kubernetes.io/name: radarr egress: - toEndpoints: - matchLabels: app.kubernetes.io/name: jackett toPorts: - ports: - port: '9117' protocol: TCP --- # CiliumNetworkPolicy gateway-ingress allow (R-NET-01/02): radarr-allow-gateway-ingress apiVersion: cilium.io/v2 kind: CiliumNetworkPolicy metadata: name: radarr-allow-gateway-ingress namespace: radarr labels: app.kubernetes.io/name: radarr spec: endpointSelector: matchLabels: app.kubernetes.io/name: radarr ingress: - fromEntities: - ingress toPorts: - ports: - port: '7878' protocol: TCP --- # CiliumNetworkPolicy internet/world egress (vpn class, R-NET-05): radarr-allow-internet-egress apiVersion: cilium.io/v2 kind: CiliumNetworkPolicy metadata: name: radarr-allow-internet-egress namespace: radarr labels: app.kubernetes.io/name: radarr spec: endpointSelector: matchLabels: app.kubernetes.io/name: radarr egress: - toEntities: - world --- # HTTPRoute radarr-7878 (R-TLS/R-DNS) apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: radarr-7878 namespace: radarr labels: app.kubernetes.io/name: radarr annotations: homelab.keithjackson.dev/auth-mode: forward-auth homelab.keithjackson.dev/auth-groups: media-users spec: parentRefs: - name: shared namespace: gateway sectionName: https hostnames: - radarr.home.keithjackson.dev rules: - matches: - path: type: PathPrefix value: / backendRefs: - name: radarr port: 7878 --- # ServiceMonitor (R-OBS-01) apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: radarr namespace: radarr labels: release: kube-prometheus-stack app.kubernetes.io/name: radarr spec: selector: matchLabels: app.kubernetes.io/name: radarr namespaceSelector: matchNames: - radarr endpoints: - port: metrics interval: 30s --- # PrometheusRule SLI alerts (R-OBS-01) apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: radarr-slis namespace: radarr labels: release: kube-prometheus-stack app.kubernetes.io/name: radarr spec: groups: - name: radarr.slis rules: - alert: radarr-down expr: up{job="radarr"} == 0 for: 5m labels: severity: critical service: radarr annotations: summary: radarr is down description: 'radarr has been unreachable for 5m (SLI: up).'