Hallo,
ich hätt da mal ein kleines Problem:
Bin gerade dabei mein seit jahren zuverlässig laufenden VDR (bisher x64 kvm mit OctopusNet SATIP) mal komplett mit "neumodischen Zeugs" zu machen. Ist eher ein Spiel-/Lernprojekt denn wirklich notwendig.
Was ich bisher gemacht habe: -
- Kubernetes Cluster auf 3 Raspi-4 (8GB) Nodes mit Ubuntu 20.04 als Host OS und microk8s (mit Kubernetes 1.19) aufgesetzt. Funktioniert soweit schon mal ganz gut für andere Dinge. Ich verwende "metallb" um die Services "nach aussen" also in mein lokales Netz zu mappen.
- Eigenes Docker Image für vdr erzeugt (custom build aus den Repositories für vdr und den paar wenigen Plugins die ich brauche - satip, streamdev-server, epgsearch, vdrmanager, live, vnsiserver, svdrposd, dummydevice). Alles wird auf dem Raspie compiliert. Ist allerdings noch Work in Progress, weil das erzeugte Image noch etwas kleiner werden soll. Base OS im Docker-Image ist auch wieder Ubuntu 20.04.
Dockerfile:
FROM ubuntu:focal as builder
COPY dist/setupvdr.sh /setupvdr.sh
COPY dist/Make.config /Make.config
#setup env
RUN \
apt-get -y update && \
export DEBIAN_FRONTEND=noninteractive && \
ln -fs /usr/share/zoneinfo/Europe/Berlin /etc/localtime && \
apt-get -y install tzdata && \
dpkg-reconfigure --frontend noninteractive tzdata && \
apt-get -y install build-essential wget git libfreetype-dev fontconfig gettext \
libcap-dev libjpeg-dev libfribidi-dev libfontconfig-dev libtntnet-dev \
libcurl4-openssl-dev libpugixml-dev libssl-dev libsystemd-dev
# setup vdr env
RUN /setupvdr.sh
# do the actual build
RUN cd /work/vdr && \
make && \
make install && \
strip /opt/vdr/bin/vdr && \
strip /opt/vdr/lib/vdr/*.so.*
RUN mkdir -p /opt/vdr/etc/plugins/live && \
cd /work/vdr/PLUGINS/src/live/live && \
cp -r * /opt/vdr/etc/plugins/live
RUN mv /opt/vdr/etc /opt/vdr/etc.deploy
######## Start a new stage from scratch #######
FROM ubuntu:focal
LABEL maintainer="Michael Class <docker@michaelclass.de>"
# set language
ENV LANG de_DE.UTF-8
ENV LC_ALL de_DE.UTF-8
ENV VDR_LANG de_DE.UTF-8
ENV TZ Europe/Berlin
# generate locates
RUN apt clean && apt update && apt install -y locales gnupg
RUN apt-get install -y tzdata
RUN locale-gen de_DE.UTF-8 en_US.UTF-8
# install necessary libraries
RUN apt-get -y update && \
export DEBIAN_FRONTEND=noninteractive && \
ln -fs /usr/share/zoneinfo/Europe/Berlin /etc/localtime && \
apt-get -y install tzdata && \
dpkg-reconfigure --frontend noninteractive tzdata && \
apt-get -y install nfs-client rsyslog \
libfreetype-dev fontconfig gettext \
libcap-dev libjpeg-dev libfribidi-dev libfontconfig-dev libtntnet-dev \
libcurl4-openssl-dev libpugixml-dev libssl-dev libsystemd-dev
# Copy the Pre-built binary file from the previous stage
COPY --from=builder /opt/vdr /opt/vdr
COPY dist/startvdr.sh /
COPY dist/rsyslog.conf /etc/
RUN echo "10.0.0.0/8\n172.16.0.0/12\n192.168.0.0/16\n" >> /opt/vdr/etc.deploy/svdrphosts.conf
COPY dist/vdr.vdrmanager /opt/vdr/etc.deploy/plugins/
COPY dist/channels.conf /opt/vdr/etc.deploy/
COPY dist/setup.conf /opt/vdr/etc.deploy/
COPY dist/conf.d/* /opt/vdr/etc.deploy/conf.d/
COPY dist/streamdevhosts.conf /opt/vdr/etc.deploy/plugins/streamdev-server/
COPY dist/allowed_hosts.conf /opt/vdr/etc.deploy/plugins/vnsiserver/
CMD ["/startvdr.sh"]
und setupvdr.sh
#!/bin/bash
# setup all sources needed to build the vdr with the necessary plugins
# under /work/vdr
WORKDIR=/work
mkdir $WORKDIR
cd $WORKDIR
git clone git://git.tvdr.de/vdr.git
cd vdr
# patch for container usage
#patch -p0 < /vdr-container.patch
# remove unneeded plugins:
rm -rf PLUGINS/src/skincurses
rm -rf PLUGINS/src/pictures
rm -rf PLUGINS/src/hello
rm -rf PLUGINS/src/epgtableid0
rm -rf PLUGINS/src/*demo
# get the actually needed plugins:
cd $WORKDIR/vdr/PLUGINS/src
# dummydevices
pushd $WORKDIR
wget http://phivdr.dyndns.org/vdr/v…vdr-dummydevice-2.0.0.tgz
popd
tar zxvf ../../../vdr-dummydevice-2.0.0.tgz
ln -s dummydevice-2.0.0 dummydevice
# satip
git clone https://github.com/rofafor/vdr-plugin-satip.git
ln -s vdr-plugin-satip satip
# streamdev-server
git clone git://projects.vdr-developer.org/vdr-plugin-streamdev.git
ln -s vdr-plugin-streamdev streamdev
# epgsearch
git clone https://github.com/vdr-projects/vdr-plugin-epgsearch.git
ln -s vdr-plugin-epgsearch epgsearch
# vdrmanager
git clone http://projects.vdr-developer.org/git/vdr-manager.git
ln -s vdr-manager/vdr-vdrmanager vdrmanager
# live
git clone git://projects.vdr-developer.org/vdr-plugin-live.git
ln -s vdr-plugin-live live
# vnsiserver
git clone https://github.com/FernetMenta/vdr-plugin-vnsiserver.git
ln -s vdr-plugin-vnsiserver vnsiserver
# svdrposd
pushd $WORKDIR
wget http://vdr.schmirler.de/svdrposd/vdr-svdrposd-1.0.0.tgz
popd
tar zxvf ../../../vdr-svdrposd-1.0.0.tgz
ln -s svdrposd-1.0.0 svdrposd
# copy Make.config
cp /Make.config $WORKDIR/vdr
startvdr.sh
#!/bin/sh
echo "running: $0 $*"
echo "active uid: $EUID"
echo "start rsyslog"
/usr/sbin/rsyslogd
echo "create vdr user"
addgroup -gid 1228 vdr
PASS=$(head /dev/urandom | tr -dc 'A-Za-z0-9!"#%&'\''()*+,-./:;<=>?@[\]^_`{|}~' | head -c 24 ; echo)
adduser -uid 1228 -gid 1228 vdr << EOF
${PASS}
${PASS}
vdr vdr
Y
EOF
echo
echo "setup cache dir"
mkdir /var/cache/vdr
chown vdr.vdr /var/cache/vdr
echo "setup file access rights"
chown -R vdr.vdr /opt/vdr
#chown -R vdr.vdr /opt/vdradmin
echo
echo "prepare config directory"
cd /opt/vdr/etc.deploy
su -c "tar -cf- . | tar -C /opt/vdr/etc -xv --skip-old-files -f-" vdr
echo "fix for live plugin"
mkdir -p /opt/vdr/share/vdr/plugins
cd /opt/vdr/share/vdr/plugins
rm -rf ./live
ln -s /opt/vdr/etc/plugins/live .
#sleep 100000
echo "starting vdr"
su -c /opt/vdr/bin/vdr vdr
#/opt/vdr/bin/vdr
- helm chart geschrieben, welches das Deployment in den Kubernetes Cluster macht (hier werden das /video Verzeichnis und das config Directory für den VDR via NFS gemountet damit die Daten persistent sind.)
Wenn alles läuft sehe ich:
# ./svdrpsend plug
220 vdr-5c8477d77f-xlm44 SVDRP VideoDiskRecorder 2.4.4; Tue Sep 22 12:09:07 2020; UTF-8
214-Available plugins:
214-dummydevice v2.0.0 - Output device that does nothing
214-satip v2.4.1-GIT-a7625c0 - SAT>IP Geräte
214-streamdev-server v0.6.1-git - VDR Streaming Server
214-epgsearch v2.4.0 - Suche im EPG nach Wiederholungen und anderem
214-vdrmanager v0.15 - VDR-Manager plugin
214-live v2.3.1 - Live Interactive VDR Environment
214-vnsiserver v1.8.0 - VDR-Network-Streaming-Interface (VNSI) Server
214-svdrposd v1.0.0 - Publish OSD menu via SVDRP
214 End of plugin list
Alles anzeigen
Code ist bisher noch nicht veröffentlicht, weil das ja alles noch sehr roh mit vielen lokalen Eiegenheiten durchsetzt ist.
2. Probleme die ich bisher noch nicht lösen konnte:
1. Wenn ich den vdr im Container als root user starte und dann mit "-u vdr" den User vdr als echten Benutzer verwenden will, dann bekomme ich beim Start:
Geht also erst mal nicht. Wenn ich den vdr direkt unter dem User "vdr" starte (also: "su -c /opt/vdr/bin/vdr vdr") startet der vdr.
Allerdings bekomme ich dann Fehlermeldungen im log:
2020-09-22T11:53:39.836187+02:00 vdr-5c8477d77f-xlm44 vdr: [57] SATIP poller thread started (pid=54, tid=57, prio=high)
2020-09-22T11:53:39.838676+02:00 vdr-5c8477d77f-xlm44 vdr: [57] ERROR (thread.c,258): Permission denied
Ist das kritisch? Und ist ggf. mein 2. Problem eine Folge davon? Was würde man erwarten das alles nicht geht wenn man den vdr Prozess direkt als nicht privilegierten Benutzer startet?
2. SATIP funktioniert nur sporadisch und meldet Fehler:
Damit ich das satip plugin überhaupt - zumindest rudimentär - zum laufen bekommen habe, habe ich folgendes gemacht:
D.h. der SATIP Server ist ausserhalb des Netzes des Clusters in meinem lokalen Netz! Und dann in der Service Definition für Kubernetes:
ports:
- port: 31900
targetPort: 31900
nodePort: 31900
protocol: UDP
name: rtp-0
(wiederholt für ports 31901-31907 ...)
Und das dann korrespondierend im deployment.
D.h. der Nodeport ist der gleiche wie der Containerport. Damit werden also die UDP Ports jeweils 1:1 gemapped und sind aus meinem Netz erreichbar unter der Adresse 192.168.63.1
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
vdr-tcp LoadBalancer 10.152.183.29 192.168.63.1 6419:31991/TCP,6420:31230/TCP,2004:30022/TCP,3000:30623/TCP,8008:30008/TCP,34890:31354/TCP 9m29s
vdr-udp LoadBalancer 10.152.183.16 192.168.63.1 31900:31900/UDP,31901:31901/UDP,31902:31902/UDP,31903:31903/UDP,31904:31904/UDP,31905:31905/UDP,31906:31906/UDP,31907:31907/UDP 9m29
Wenn ich alles neu starte, dann bekomme ich auch EPG daten (z.b. ersichtlich über das Live frontend welches über http://192.168.62.1:8008 zugänglich ist, (Mein lokales netz mit dem SATIP server (ist 192.168.62.0/23 und das Netz mit calico im cluster für die services ist dann 10.152.183.0/24). kube-proxy sollte das dann mappen.
Sollte so ein Setup denn überhaupt funktionieren? Sprich vdr mit satip Plugin im Cluster mit IPs des Clusters und dann der SATIP-Server ausserhalb des Clusters in einem anderen Subnetz. Kube-proxy macht ja da sowas wie NAT wenn ich das richtig verstehe. Hat jemand so ein Setup bereits am laufen?
Gruß Michael