summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/flufigut.py19
-rw-r--r--templates/default/kubernetes/nginx-streamer-cm.yml.j2106
-rw-r--r--templates/default/kubernetes/nginx-streamer-deploy.yml.j262
-rw-r--r--templates/default/kubernetes/nginx-streamer-svc.yml.j216
4 files changed, 199 insertions, 4 deletions
diff --git a/src/flufigut.py b/src/flufigut.py
index 0009c50..ad2bfc4 100755
--- a/src/flufigut.py
+++ b/src/flufigut.py
@@ -627,7 +627,7 @@ class K8sDeployment:
object_yaml = tmpl.render(namespace=self._namespace, desc=self._desc, planet=self._planet, worker=worker)
return yaml.load(object_yaml)
- def _deploy_manager(self, template_dir, tmpl_env, v1, appsV1):
+ def _deploy_flumotion_manager(self, template_dir, tmpl_env, v1, appsV1):
svc = self.__generate_object(tmpl_env, 'flumotion-manager-svc.yml')
v1.create_namespaced_service(self._namespace, svc)
@@ -642,7 +642,7 @@ class K8sDeployment:
deploy = self.__generate_object(tmpl_env, 'flumotion-manager-deploy.yml')
appsV1.create_namespaced_deployment(self._namespace, deploy)
- def _deploy_worker(self, template_dir, tmpl_env, v1, appsV1, worker):
+ def _deploy_flumotion_worker(self, template_dir, tmpl_env, v1, appsV1, worker):
if not len(worker['subs']):
worker['subs']['worker'] = {
'fullname': worker['name'],
@@ -660,6 +660,16 @@ class K8sDeployment:
deploy = self.__generate_object(tmpl_env, 'flumotion-worker-deploy.yml', worker)
appsV1.create_namespaced_deployment(self._namespace, deploy)
+ def _deploy_nginx_worker(self, template_dir, tmpl_env, v1, appsV1, worker):
+ cm = self.__generate_object(tmpl_env, 'nginx-streamer-cm.yml', worker)
+ v1.create_namespaced_config_map(self._namespace, cm)
+
+ svc = self.__generate_object(tmpl_env, 'nginx-streamer-svc.yml', worker)
+ v1.create_namespaced_service(self._namespace, svc)
+
+ deploy = self.__generate_object(tmpl_env, 'nginx-streamer-deploy.yml', worker)
+ appsV1.create_namespaced_deployment(self._namespace, deploy)
+
def deploy(self, template_dir):
v1 = kubernetes.client.CoreV1Api()
appsV1 = kubernetes.client.AppsV1Api()
@@ -668,9 +678,10 @@ class K8sDeployment:
loader = jinja2.FileSystemLoader(os.path.join(template_dir, self._desc.globals['templates'], 'kubernetes'))
tmpl_env = jinja2.Environment(loader=loader, line_statement_prefix='%%')
- self._deploy_manager(template_dir, tmpl_env, v1, appsV1)
+ self._deploy_flumotion_manager(template_dir, tmpl_env, v1, appsV1)
for _, worker in self._planet.workers.items():
- self._deploy_worker(template_dir, tmpl_env, v1, appsV1, worker)
+ self._deploy_flumotion_worker(template_dir, tmpl_env, v1, appsV1, worker)
+ self._deploy_nginx_worker(template_dir, tmpl_env, v1, appsV1, worker)
def wipe(self):
v1 = kubernetes.client.CoreV1Api()
diff --git a/templates/default/kubernetes/nginx-streamer-cm.yml.j2 b/templates/default/kubernetes/nginx-streamer-cm.yml.j2
new file mode 100644
index 0000000..4171305
--- /dev/null
+++ b/templates/default/kubernetes/nginx-streamer-cm.yml.j2
@@ -0,0 +1,106 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ namespace: {{ namespace }}
+ name: nginx-streamer-{{ worker.name }}
+ labels:
+ app: nginx
+ type: streamer
+ worker: {{ worker.name }}
+data:
+ nginx.conf: |
+ worker_processes 4;
+ pid /srv/nginx.pid;
+ error_log /dev/stderr notice;
+
+ load_module modules/ngx_rtmp_module.so;
+
+ events {
+ worker_connections 768;
+ # multi_accept on;
+ }
+
+ http {
+ sendfile on;
+ tcp_nopush on;
+ tcp_nodelay on;
+ keepalive_timeout 65;
+ types_hash_max_size 2048;
+
+ server_names_hash_bucket_size 64;
+
+ include /etc/nginx/mime.types;
+ default_type application/octet-stream;
+
+ access_log /dev/null;
+
+ server {
+ listen 8000 default_server;
+ listen [::]:8000 default_server;
+ server_name _;
+
+ root /srv/www;
+
+ location / {
+ types {
+ application/vnd.apple.mpegurl m3u8;
+ }
+ expires -1s;
+ add_header Cache-Control "no-store,must-revalidate,max-age=0";
+ }
+ }
+ }
+
+ rtmp {
+ access_log /dev/null;
+
+ server {
+ listen localhost:1935;
+
+ respawn on;
+
+ exec_static ffmpeg -i http://flumotion-worker-{{ worker.name }}:8000/av-orig-flash-mini.flv
+ -acodec copy -vcodec copy -vbsf h264_mp4toannexb -f flv rtmp://localhost/hls/av-orig-mini
+ -acodec copy -vcodec copy -vbsf h264_mp4toannexb -f flv rtmp://localhost/dash/av-orig-mini;
+ exec_static ffmpeg -i http://flumotion-worker-{{ worker.name }}:8000/av-orig-flash-low.flv
+ -acodec copy -vcodec copy -vbsf h264_mp4toannexb -f flv rtmp://localhost/hls/av-orig-low
+ -acodec copy -vcodec copy -vbsf h264_mp4toannexb -f flv rtmp://localhost/dash/av-orig-low;
+ exec_static ffmpeg -i http://flumotion-worker-{{ worker.name }}:8000/av-orig-flash-medium.flv
+ -acodec copy -vcodec copy -vbsf h264_mp4toannexb -f flv rtmp://localhost/hls/av-orig-medium
+ -acodec copy -vcodec copy -vbsf h264_mp4toannexb -f flv rtmp://localhost/dash/av-orig-medium;
+ exec_static ffmpeg -i http://flumotion-worker-{{ worker.name }}:8000/av-orig-flash-high.flv
+ -acodec copy -vcodec copy -vbsf h264_mp4toannexb -f flv rtmp://localhost/hls/av-orig-high
+ -acodec copy -vcodec copy -vbsf h264_mp4toannexb -f flv rtmp://localhost/dash/av-orig-high;
+
+ application hls {
+ live on;
+
+ hls on;
+ hls_path /srv/www/hls;
+ hls_fragment 3;
+ hls_playlist_length 12;
+ hls_nested on;
+ hls_cleanup on;
+ hls_fragment_naming timestamp;
+ hls_fragment_slicing aligned;
+ hls_type live;
+ hls_base_url http://localhost:8000/hls/;
+
+ hls_variant -mini BANDWIDTH=350000;
+ hls_variant -low BANDWIDTH=700000;
+ hls_variant -medium BANDWIDTH=1200000;
+ hls_variant -high BANDWIDTH=2000000;
+ }
+
+ application dash {
+ live on;
+
+ dash on;
+ dash_path /srv/www/dash;
+ dash_fragment 3;
+ dash_playlist_length 12;
+ dash_nested on;
+ dash_cleanup on;
+ }
+ }
+ }
diff --git a/templates/default/kubernetes/nginx-streamer-deploy.yml.j2 b/templates/default/kubernetes/nginx-streamer-deploy.yml.j2
new file mode 100644
index 0000000..857dfcc
--- /dev/null
+++ b/templates/default/kubernetes/nginx-streamer-deploy.yml.j2
@@ -0,0 +1,62 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ namespace: {{ namespace }}
+ name: nginx-streamer-{{ worker.name }}
+ labels:
+ app: nginx
+ type: streamer
+ worker: {{ worker.name }}
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: nginx
+ type: streamer
+ worker: {{ worker.name }}
+ strategy:
+ type: Recreate
+ revisionHistoryLimit: 5
+ template:
+ metadata:
+ labels:
+ app: nginx
+ type: streamer
+ worker: {{ worker.name }}
+ spec:
+ nodeName: {{ worker.name }}
+ securityContext:
+ runAsUser: 998
+ fsGroup: 998
+ containers:
+ - name: nginx
+ image: spreadspace/nginx-streaming
+ imagePullPolicy: Always
+ args:
+ - nginx
+ - -c
+ - /srv/config/nginx.conf
+ - -g
+ - "daemon off;"
+ volumeMounts:
+ - name: home
+ mountPath: /srv
+ - name: nginx-lib
+ mountPath: /var/lib/nginx
+ - name: nginx-config
+ mountPath: /srv/config
+ - name: www
+ mountPath: /srv/www
+ volumes:
+ - name: home
+ emptyDir:
+ medium: Memory
+ - name: nginx-lib
+ emptyDir:
+ medium: Memory
+ - name: nginx-config
+ configMap:
+ name: nginx-streamer-{{ worker.name }}
+ - name: www
+ emptyDir:
+ medium: Memory
diff --git a/templates/default/kubernetes/nginx-streamer-svc.yml.j2 b/templates/default/kubernetes/nginx-streamer-svc.yml.j2
new file mode 100644
index 0000000..a6a9f0d
--- /dev/null
+++ b/templates/default/kubernetes/nginx-streamer-svc.yml.j2
@@ -0,0 +1,16 @@
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: {{ namespace }}
+ name: nginx-streamer-{{ worker.name }}
+ labels:
+ app: nginx
+ type: streamer
+ worker: {{ worker.name }}
+spec:
+ selector:
+ app: nginx
+ type: streamer
+ worker: {{ worker.name }}
+ ports:
+ - port: 8000