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
- Kubernetes Documentation Retrieved 2025.04.29
- Understanding Storage Classes and Dynamic Provisioning in Kubernetes Retrieved 2025.04.29
- Kubernetes Storage: PV, PVC and Storage Class Retrieved 2025.04.29
- TechWorld with Nana Retrieved 2025.04.29
- DevOps Toolkit Retrieved 2025.04.29
- Kubernetes Persistent Volume (PV) and Persistent Volume Claim (PVC) Retrieved 2025.04.29