𝔩𝔢𝔩𝕠𝔭𝔢𝔷
Theme

Homelab

Plex LAN Configuration

Configuring Plex for the Lab VLAN

Overview

This article completes the Plex migration to the Lab VLAN. Plex in Kubernetes requires additional configuration to work across VLANs: a static IP from MetalLB's static pool, proper IP advertisement to Plex.tv, and LAN network settings so clients on other VLANs are recognized as local.

Tip:Having trouble? See v1.4.0 for what your setup should look like after completing this article.

Before You Begin

Prerequisites

What We're Setting Up

ComponentBeforeAfter
Service IPDynamic from poolStatic 192.168.10.40
ADVERTISE_IP(none)LoadBalancer IP
LAN Networks(empty)Trusted VLAN
Custom URL(none)LoadBalancer IP

Why These Settings

Plex in Kubernetes needs explicit configuration for VLAN environments:

  • Static IP: Services needing stable URLs should use MetalLB's static pool
  • ADVERTISE_IP: Tells Plex to publish the LoadBalancer IP instead of pod IP
  • Custom URL: Ensures clients discover the correct address via Plex.tv
  • LAN Networks: Clients on Trusted VLAN (192.168.30.x) are treated as local, not remote

Configure Static IP

ConfigMap

Define the IP and ADVERTISE_IP in a ConfigMap, then inject them into the HelmRelease using valuesFrom. This follows the same pattern used for secrets like plex-claim.

k8s/apps/plex/configmap.yaml:

---
apiVersion: v1
kind: ConfigMap
metadata:
    name: plex-vars
    namespace: plex
data:
    ADVERTISE_IP: "http://192.168.10.40:32400"
    PLEX_IP: "192.168.10.40"

HelmRelease

Add valuesFrom entries to inject the ConfigMap values at the correct paths. The backslash escapes the dots in the annotation key.

k8s/apps/plex/helmrelease.yaml (HelmRelease section):

# ... existing HelmRepository + HelmRelease header ...
spec:
    # ... existing spec.interval, chart ...
    valuesFrom:
        - kind: Secret
          name: plex-claim
          valuesKey: claim
          targetPath: extraEnv.PLEX_CLAIM
        - kind: ConfigMap # ADD
          name: plex-vars # ADD
          valuesKey: ADVERTISE_IP # ADD
          targetPath: extraEnv.ADVERTISE_IP # ADD
        - kind: ConfigMap # ADD
          name: plex-vars # ADD
          valuesKey: PLEX_IP # ADD
          targetPath: service.annotations.metallb\.universe\.tf/loadBalancerIPs # ADD
    values:
        # ... existing image, extraEnv.TZ, service.type, service.port ...
        # ... existing pms, extraVolumes, extraVolumeMounts ...

Kustomization

Add the ConfigMap to resources:

k8s/apps/plex/kustomization.yaml:

# ... existing header ...
resources:
    - namespace.yaml
    - configmap.yaml # ADD
    - pvc.yaml
    - secret.sops.yaml
    - helmrelease.yaml

Commit Changes

git add k8s/apps/plex/
git commit -m "feat(plex): add static IP and ADVERTISE_IP for cross-VLAN"
git push

Reconcile and Restart

flux reconcile source git flux-system
flux reconcile kustomization sync
kubectl rollout restart statefulset -n plex plex-plex-media-server

Verify Static IP

kubectl get svc -n plex

Expected: External IP shows 192.168.10.40.

Verify Configuration

Check Plex Network Settings

Open Plex Web UI (http://192.168.10.40:32400/web) → SettingsNetworkShow Advanced.

Verify these settings are populated1:

  • Custom server access URLs: http://192.168.10.40:32400
  • LAN Networks: 192.168.30.0/24

LAN Networks tells Plex to treat Trusted VLAN clients as local (no bandwidth restrictions). Without it, clients from a different subnet would be treated as remote.

Test Streaming

From Apple TV or another Trusted device, play content and verify full quality streaming.

Check Plex Dashboard

In Plex Web UI → ActivityDashboard:

  • Active streams should show "direct play" for local clients
  • No bandwidth throttling indicators

Next Steps

With Plex configured for the Lab VLAN, Phase 2 migration is complete. Continue with infrastructure hardening.

See: Tailscale Hardening

Resources

Footnotes

  1. Plex, "Network Settings," support.plex.tv. Accessed: Feb. 26, 2026. [Online]. Available: https://support.plex.tv/articles/200430283-network/

Previous
MetalLB Migration