diff options
-rwxr-xr-x | src/flufigut.py | 19 | ||||
-rw-r--r-- | templates/default/kubernetes/nginx-streamer-cm.yml.j2 | 106 | ||||
-rw-r--r-- | templates/default/kubernetes/nginx-streamer-deploy.yml.j2 | 62 | ||||
-rw-r--r-- | templates/default/kubernetes/nginx-streamer-svc.yml.j2 | 16 |
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 |