diff --git a/examples/streamer/Makefile b/examples/streamer/Makefile new file mode 100644 index 0000000..0e9a10f --- /dev/null +++ b/examples/streamer/Makefile @@ -0,0 +1,12 @@ +NAME = streamer +DESCRIPTION = "A simple ffmpeg based streamer" +CONTAINERS = streamer +AUX_CONTAINERS = proxy-proxy-nsc proxy-sidecar-nse +PODS = proxy-nsc source +NETWORK_SERVICES = streamer +CHECK = + +# should not fail go linter +FAIL_GOLINT = + +include $(TOP)/mk/targets.mk diff --git a/examples/streamer/README.md b/examples/streamer/README.md new file mode 100644 index 0000000..75b9546 --- /dev/null +++ b/examples/streamer/README.md @@ -0,0 +1,16 @@ +# A video streaming example + +The purpose of this example is to demonstrate how NSM can be used to develop a video streaming solution in the cloud. It relies on the `proxy` example and borrows its `proxy-nsc` to provide an NSM entry point where the HTTP request turns into + +``` +``` + +------------+ +-------------+ + GET / HTTP/1.1 | | | | + NSM-App: Source | | app=source | Video | ++----------------------> Proxy NSC +----------------------> Source | + | | | | + | | | | + +------------+ +-------------+ +``` + +``` diff --git a/examples/streamer/assets/video.mp4 b/examples/streamer/assets/video.mp4 new file mode 100644 index 0000000..e527cec Binary files /dev/null and b/examples/streamer/assets/video.mp4 differ diff --git a/examples/streamer/k8s/proxy-nsc.yaml b/examples/streamer/k8s/proxy-nsc.yaml new file mode 100644 index 0000000..a5bb093 --- /dev/null +++ b/examples/streamer/k8s/proxy-nsc.yaml @@ -0,0 +1,32 @@ +--- +apiVersion: apps/v1 +kind: Deployment +spec: + replicas: 1 + selector: + matchLabels: + networkservicemesh.io/app: "proxy-nsc" + networkservicemesh.io/impl: "streamer" + template: + metadata: + labels: + networkservicemesh.io/app: "proxy-nsc" + networkservicemesh.io/impl: "streamer" + spec: + nodeSelector: + node-role.kubernetes.io/master: "" + containers: + - name: proxy-nsc + image: networkservicemesh/proxy-proxy-nsc:latest + imagePullPolicy: IfNotPresent + env: + - name: OUTGOING_NSC_NAME + value: "streamer" + - name: PROXY_HOST + value: ":8080" + resources: + limits: + networkservicemesh.io/socket: 1 +metadata: + name: proxy-nsc + namespace: default diff --git a/examples/streamer/k8s/source.yaml b/examples/streamer/k8s/source.yaml new file mode 100644 index 0000000..4b6006d --- /dev/null +++ b/examples/streamer/k8s/source.yaml @@ -0,0 +1,39 @@ +--- +apiVersion: apps/v1 +kind: Deployment +spec: + replicas: 1 + selector: + matchLabels: + networkservicemesh.io/app: "source" + networkservicemesh.io/impl: "streamer" + template: + metadata: + labels: + networkservicemesh.io/app: "source" + networkservicemesh.io/impl: "streamer" + spec: + nodeSelector: + node-role.kubernetes.io/master: "" + containers: + - name: sidecar-nse + image: networkservicemesh/proxy-sidecar-nse:latest + imagePullPolicy: IfNotPresent + env: + - name: ADVERTISE_NSE_NAME + value: "streamer" + - name: ADVERTISE_NSE_LABELS + value: "app=source" + - name: TRACER_ENABLED + value: "true" + - name: IP_ADDRESS + value: "10.60.1.0/24" + resources: + limits: + networkservicemesh.io/socket: 1 + - name: source + image: networkservicemesh/streamer-streamer:latest + imagePullPolicy: IfNotPresent +metadata: + name: source + namespace: default diff --git a/examples/streamer/k8s/streamer.yaml b/examples/streamer/k8s/streamer.yaml new file mode 100644 index 0000000..5dcf6b4 --- /dev/null +++ b/examples/streamer/k8s/streamer.yaml @@ -0,0 +1,13 @@ +--- +apiVersion: networkservicemesh.io/v1alpha1 +kind: NetworkService +metadata: + name: streamer +spec: + payload: IP + matches: + - match: + route: + - destination: + destinationSelector: + app: source diff --git a/examples/streamer/streamer/Dockerfile b/examples/streamer/streamer/Dockerfile new file mode 100644 index 0000000..ab6c379 --- /dev/null +++ b/examples/streamer/streamer/Dockerfile @@ -0,0 +1,5 @@ +FROM jrottenberg/ffmpeg:4.2-alpine as runtime +RUN apk --no-cache add nmap-ncat +COPY ./examples/streamer/assets/ /streamer/assets/ +COPY ./examples/streamer/streamer/scripts/* /bin/ +ENTRYPOINT ["/bin/entry.sh"] diff --git a/examples/streamer/streamer/scripts/entry.sh b/examples/streamer/streamer/scripts/entry.sh new file mode 100755 index 0000000..822ddb9 --- /dev/null +++ b/examples/streamer/streamer/scripts/entry.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +while true +do + ncat --exec "/bin/source.sh" -l 0.0.0.0 80 +done diff --git a/examples/streamer/streamer/scripts/source.sh b/examples/streamer/streamer/scripts/source.sh new file mode 100755 index 0000000..891e3c4 --- /dev/null +++ b/examples/streamer/streamer/scripts/source.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +echo -ne "HTTP/1.0 200 OK\r\n\r\n" +ffmpeg \ + -re \ + -fflags +genpts \ + -stream_loop -1 \ + -i /streamer/assets/video.mp4 \ + -c copy \ + -f mpegts -