Code Monkey home page Code Monkey logo

kube-plex's Introduction

kube-plex

kube-plex is a scalable Plex Media Server solution for Kubernetes. It distributes transcode jobs by creating jobs in a Kubernetes cluster to perform transcodes, instead of running transcodes on the Plex Media Server instance itself.

ressu/kube-plex is a fork from munnerz/kube-plex.

How it works

kube-plex works by replacing the Plex Transcoder program on the main PMS instance with our own little shim. This shim intercepts calls to Plex Transcoder, and creates Kubernetes pods to perform the work instead. These pods use shared persistent volumes to store the results of the transcode (and read your media!).

Prerequisites

  • A persistent volume type that supports ReadWriteMany volumes (e.g. NFS, Amazon EFS)
  • Your Plex Media Server must be configured to allow connections from unauthorized users for your pod network, else the transcode job is unable to report information back to Plex about the state of the transcode job. At some point in the future this may change, but it is a required step in order to make transcodes work right now.

Setup

This guide describes a way to configure Kube-plex with a Plex Media Server instance on a Kubernetes cluster. Provided helm chart is intended as both a reference and an easy way of creating a kube-plex deployment. Advanced users are encouraged to explore deployment options and to contribute additional deployment examples.

Plex claim token

Create a Plex Claim Token by visiting plex.tv/claim. Plex claim token is used to associate a Plex instance with a Plex account. Claim token expires automatically within minutes of creating the token. If Plex instance fails to register with Plex Account when creating a new deployment, a good troubleshooting step is to recreate the claim token and deployment.

Claim token isn't the only way to register an instance to a Plex Account. See "Access Plex Dashboard" below.

Remote Access

Out of the box, Plex remote access won't work from inside a Kubernetes environment. To address that, start by configuring an Ingress or LoadBalanacer for the deployment.

Then, go to Settings > Network (Show Advanced) > Custom server access URLs

Here, you can configure the ingress you configured or forward a port from your router to the LoadBalancer IP that was assigned. Once configured, restart the deployment.

Even though the Remote Access check if flaky and may indicate failure, it mostly is working. Test it by using an off network client (e.g. a phone) to verify.

Helm chart deployment

Register the helm chart for this repository by running

helm repo add kube-plex https://ressu.github.io/kube-plex

Claim token and other chart configuration is defined with the --set flags. Available configuration options are described in the chart and in more detail in values.yaml.

If you have pre-existing persistent volume claims for your media, you can specify its name with --set persistence.data.claimName. If not specified, a persistent volume will be automatically provisioned for you.

In order for the transcoding to work, a shared transcode persistent volume claim needs to be defined with --set persistence.transcode.claimName or by defining the relevant parameters separately.

As an example, the following command would install or upgrade an existing plex deployment with the given values:

helm upgrade plex kube-plex \
    --namespace plex \
    --install \
    --set claimToken=[insert claim token here] \
    --set persistence.data.claimName=[existing-pms-data-pvc] \
    --set persistence.transcode.enabled=true \
    --set persistence.transcode.claimName=[shared-pms-transcode-pvc] \
    --set ingress.enabled=true

This will deploy a scalable Plex Media Server instance that uses Kubernetes as a backend for executing transcode jobs.

Access Plex Dashboard

If you used claim token, the plex instance should be visible in Plex Web App. If the token registration failed, access the instance using using kubectl -n plex port-forward <pod name> 32400.

Once the registration has been completed, the instance can be accessed via the load balancer IP (via kubectl get service) or the ingress (if provisioned with --set ingress.enabled=true).

Set pod network allowlist

Visit Settings->Server->Network and add your pod network subnet to the List of IP addresses and networks that are allowed without auth (near the bottom). For example, 10.100.0.0/16 is the subnet that pods in my cluster are assigned IPs from, so I enter 10.100.0.0/16 in the box.

You should now be able to play media from your PMS instance

Internal operations

Kube-plex will automatically create transcoding jobs within the Kubernetes instance. The jobs have shared transcode and data mounts with the main kube-plex pod. Kube-plex replaces the Plex Transcoder binary with a launcher on Plex startup. Kube-plex launcher processes the arguments from Plex and creates a transcoding job to handle the final transcoding.

$ kubectl get pod,job
NAME                                        READY   STATUS    RESTARTS   AGE
pod/kube-plex-694d659b64-7wg2b              1/1     Running   0          6d23h
pod/pms-elastic-transcoder-tqw5s-8w2bc      1/1     Running   0          4s

NAME                                     COMPLETIONS   DURATION   AGE
job.batch/pms-elastic-transcoder-tqw5s   0/1           4s         5s

Transcoder pod will run a shim which will

  • Download codecs from main kube-plex pod
  • Relay transcoder callbacks from Plex Transcoder to main kube-plex

Logging from kube-plex processes is written to Plex process and can be viewed in Settings->Manage->Console.

kube-plex's People

Contributors

munnerz avatar ressu avatar billimek avatar unstoppablemango avatar brandon099 avatar hansaya avatar rkbennett avatar simplyzee avatar casidiablo avatar onedr0p avatar zebernst avatar dependabot[bot] avatar niksko avatar msenebald avatar craigcabrey avatar gandazgul avatar drewstinnett avatar sputnik13 avatar regisbsb avatar tedder avatar yoshwata avatar hogtrough avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.