Banner image

Setting up Radarr + Sonarr on k3s in Rocky Linux

Categories: Coding

Updated: 2025.06.15

PART 1 OF THIS GUIDE IS MANDATORY

This is the continuation of my quest in building a full *arr stack (Jellyfin, Jellyseerr, Radarr, Sonarr, Prowlarr, Qbittorrent) with k3s (for funsies) in order for my parents not renting out movies from goddamn Telekom.

If you wish to gain some basic understandement on what each of these files are for, then check out the part 1, aka the 'Setting up Jellyfin on k3s in Rocky Linux' article.

Radarr and Sonarr setup

Since I will show both Radarr and Sonarr, you will see 2 deployment, service and other files in each code segments. Mostly speaking you won't see that much of a difference compared to the part 1 of my article. The main difference is that we are downloading either Radarr or Sonarr.

These are the deployment configuration, which will assemble the pod. The main notable difference compared to Jellyfin is that these deployments require a 'downloads' volume. This is where the requested media will be downloaded into.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: radarr-deployment
  labels:   # Define labels to refer to this exact deployment
    app: radarr
spec:
  replicas: 1   # Amount of pods to be present
  selector:
    matchLabels:    # Define which labelled pods to manage
      app: radarr
  template:
    metadata:
      labels:   # Apply labels to deployed pods
        app: radarr
    spec:
      containers:
      - name: radarr
        image: linuxserver/radarr:5.21.1
        env:
          - name: TZ
            value: "Etc/UTC"
          - name: PUID
            value: "1000"   # PUID and PGID are needed for permission issues
          - name: GUID
            value: "1000"
        ports:
        - containerPort: 7878
        volumeMounts:       # Path to folders inside the container
          - name: config
            mountPath: /config
          - name: movies
            mountPath: /movies
          - name: downloads
            mountPath: /downloads
      volumes:              # Select the volume claims and attach it to their corresponding path
        - name: config
          persistentVolumeClaim:
            claimName: radarr-config-pvc
        - name: movies
          persistentVolumeClaim:
            claimName: movies-pvc
        - name: downloads
          persistentVolumeClaim:
            claimName: downloads-pvc
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sonarr-deployment
  labels:
    app: sonarr
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sonarr
  template:
    metadata:
      labels:
        app: sonarr
    spec:
      containers:
      - name: sonarr
        image: linuxserver/sonarr:4.0.14
        env:
          - name: TZ
            value: "Etc/UTC"
          - name: PUID
            value: "1000"
          - name: GUID
            value: "1000"
        ports:
        - containerPort: 8989
        volumeMounts:
          - name: config
            mountPath: /config
          - name: tvseries
            mountPath: /tvseries
          - name: downloads
            mountPath: /downloads
      volumes:
        - name: config
          persistentVolumeClaim:
            claimName: sonarr-config-pvc
        - name: tvseries
          persistentVolumeClaim:
            claimName: tvseries-pvc
        - name: downloads
          persistentVolumeClaim:
            claimName: downloads-pvc

And these are the service configurations, needed for reaching the deployments, AKA the Radarr and Sonarr pods.

apiVersion: v1
kind: Service
metadata:
  name: radarr-service
spec:
  selector:
    app: radarr
  ports:
    - protocol: TCP
      port: 7878
      targetPort: 7878
---
apiVersion: v1
kind: Service
metadata:
  name: sonarr-service
spec:
  selector:
    app: sonarr
  ports:
    - protocol: TCP
      port: 8989
      targetPort: 8989

Here are the volumes which are needed to make Sonarr and Radarr work. Do note that a 'movies' volume already has been created in the part 1 of this guide, so we only need to create a Radarr and Sonarr specific config volume and a 'downloads' volume where the movies and series will be downloaded.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: radarr-config-pvc
spec:
  storageClassName: local-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  volumeName: radarr-config-pv
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sonarr-config-pvc
spec:
  storageClassName: local-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  volumeName: sonarr-config-pv
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: downloads-pvc
spec:
  storageClassName: local-storage
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 500Gi
  volumeName: downloads-pv
apiVersion: v1
kind: PersistentVolume
metadata:
  name: radarr-config-pv
spec:
  storageClassName: local-storage
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /pool/filesystem/radarr/data
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: sonarr-config-pv
spec:
  storageClassName: local-storage
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /pool/filesystem/sonarr/data
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: downloads-pv
spec:
  storageClassName: local-storage
  capacity:
    storage: 500Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: /pool/filesystem/downloads

The ingress configuration was just appended with 2 new domains, which forward to the Radarr and Sonarr deployments.

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
  annotations:
    traefik.ingress.kubernetes.io/router.middlewares: default-content-type-options@kubernetescrd
spec:
  rules:
    - host: jellyfin.domain.xyz
      http:
        paths:
          - pathType: Prefix
            path: /
            backend:
              service:
                name: jellyfin-service
                port:
                  number: 8096
    - host: radarr.domain.xyz
      http:
        paths:
          - pathType: Prefix
            path: /
            backend:
              service:
                name: radarr-service
                port:
                  number: 7878
    - host: sonarr.domain.xyz
      http:
        paths:
          - pathType: Prefix
            path: /
            backend:
              service:
                name: sonarr-service
                port:
                  number: 8989

Good luck with configuring Radarr and Sonarr up. They can be finnicky sometimes :D

Useful fixes for configuration issues

  • Nyaa.si results don't show up when searching on Radarr: This is a compatiblity issue with nyaa.si, which can be resolved if you had setup the indexers with Prowlarr. In Prowlarr, edit the nyaa.si indexer, and in it's settings turn on 'Improve Radarr compatibility by removing year information from keywords and adding it to Release Titles' option.

Sources