diff --git a/nmos/README.md b/nmos/README.md index b8a402a1..bdbcd418 100644 --- a/nmos/README.md +++ b/nmos/README.md @@ -183,15 +183,28 @@ docker compose up #### 6. Kubernetes for running NMOS registry and controller, client and testing tool [OPTION #2] +In `nmos-client-tx.yaml` and `nmos-client-rx.yaml` edit lines for ConfiMap: + +``` yaml +"domain": ".svc.cluster.local", +"ffmpeg_grpc_server_address": "..svc.cluster.local", +"ffmpeg_grpc_server_port": "", +``` + + ```bash cd /nmos/k8s # Install minikube https://minikube.sigs.k8s.io/docs/start/?arch=%2Fwindows%2Fx86-64%2Fstable%2F.exe+download minikube start # Build iamges. Refer to 4. Build images -# Adjust ConfigMaps in /nmos/k8s/nmos-client.yaml, /nmos/k8s/nmos-registry.yaml and /nmos/k8s/nmos-testing.yaml -kubectl apply -f /nmos/k8s/nmos-client.yaml -kubectl apply -f /nmos/k8s/nmos-registry.yaml -kubectl apply -f /nmos/k8s/nmos-testing.yaml +# Adjust ConfigMaps in /nmos/k8s/bcs/nmos-client-.yaml, /nmos/k8s/testing-dev/nmos-registry.yaml and /nmos/k8s/testing-dev/nmos-testing.yaml + +# Set environment variables: VFIO_PORT_TX and VFIO_PORT_RX that are for virtual functions interfaces +kubectl apply -f /nmos/k8s/bcs/nmos-client-tx.yaml +kubectl apply -f /nmos/k8s/bcs/nmos-client-rx.yaml +kubectl apply -f /nmos/k8s/testing-dev/nmos-registry.yaml +kubectl apply -f /nmos/k8s/testing-dev/nmos-is-05-controller.yaml +kubectl apply -f /nmos/k8s/testing-dev/nmos-testing.yaml #optional # Useful for accessing testing tool browser: https://minikube.sigs.k8s.io/docs/handbook/accessing/ ``` diff --git a/nmos/k8s/bcs/nmos-client-rx.yaml b/nmos/k8s/bcs/nmos-client-rx.yaml new file mode 100644 index 00000000..f94fe6d7 --- /dev/null +++ b/nmos/k8s/bcs/nmos-client-rx.yaml @@ -0,0 +1,157 @@ +#SPDX-FileCopyrightText: Copyright (c) 2024 Intel Corporation +# +#SPDX-License-Identifier: BSD-3-Clause + +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: nmos-node-config-rx + namespace: default +data: + node.json: | + { + "logging_level": 10, + "http_port": 95, + "label": "intel-broadcast-suite", + "senders": ["v"], + "senders_count": [0], + "receivers": ["v"], + "receivers_count": [1], + "device_tags": { + "pipeline": ["rx"] + }, + "function": "rx", + "gpu_hw_acceleration": "none", + "domain": "default.svc.cluster.local", + "ffmpeg_grpc_server_address": "tiber-broadcast-suite-rx.default.svc.cluster.local", + "ffmpeg_grpc_server_port": "", + "receiver_payload_type":112, + "receiver": [{ + "stream_payload": { + "video": { + "frame_width": 1920, + "frame_height": 1080, + "frame_rate": { "numerator": 60, "denominator": 1 }, + "pixel_format": "yuv422p10le", + "video_type": "rawvideo" + }, + "audio": { + "channels": 2, + "sampleRate": 48000, + "format": "pcm_s24be", + "packetTime": "1ms" + } + }, + "stream_type": { + "st2110" : { + "transport" : "st2110-20", + "payloadType" : 112 + } + } + }], + "sender": [{ + "stream_payload": { + "video": { + "frame_width": 1920, + "frame_height": 1080, + "frame_rate": { "numerator": 60, "denominator": 1 }, + "pixel_format": "yuv422p10le", + "video_type": "rawvideo" + }, + "audio": { + "channels": 2, + "sampleRate": 48000, + "format": "pcm_s24be", + "packetTime": "1ms" + } + }, + "stream_type": { + "file": { + "path": "/videos/recv", + "filename": "1920x1080p10le_3.yuv" + } + } + }] + } + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nmos-client-rx + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app: nmos-client-rx + template: + metadata: + labels: + app: nmos-client-rx + spec: + containers: + - name: nmos-client-rx + image: nmos-cpp-node:1.2A-f549712 + ports: + - containerPort: 1084 + env: + - name: RUN_NODE + value: "TRUE" + - name: VFIO_PORT_TX + value: "${VFIO_PORT_TX}" + - name: VFIO_PORT_RX + value: "${VFIO_PORT_RX}" + volumeMounts: + - name: nmos-node-config-rx + mountPath: /home/node.json + subPath: node.json + resources: + requests: + cpu: 1 + memory: 500Mi + limits: + cpu: 1 + memory: 500Mi + securityContext: + readOnlyRootFilesystem: true + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + capabilities: + drop: + - ALL + readinessProbe: + httpGet: + path: / + port: 50052 + host: tiber-broadcast-suite-rx.default.svc.cluster.local + initialDelaySeconds: 5 + periodSeconds: 10 + volumes: + - name: nmos-node-config-rx + configMap: + name: nmos-node-config-rx + +--- +apiVersion: v1 +kind: Service +metadata: + name: nmos-client-rx + namespace: default +spec: + type: NodePort + selector: + app: nmos-client-rx + ports: + - protocol: TCP + port: 1085 + targetPort: 1085 + name: nmos-client-rx-node-port-http + nodePort: 30085 + - protocol: TCP + port: 50052 + targetPort: 50052 + name: grpc-client-to-ffmpeg + nodePort: 30052 diff --git a/nmos/k8s/bcs/nmos-client-tx.yaml b/nmos/k8s/bcs/nmos-client-tx.yaml new file mode 100644 index 00000000..c854b014 --- /dev/null +++ b/nmos/k8s/bcs/nmos-client-tx.yaml @@ -0,0 +1,156 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 Intel Corporation +# +# SPDX-License-Identifier: BSD-3-Clause +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: nmos-node-config-tx + namespace: default +data: + node.json: | + { + "logging_level": 10, + "http_port": 90, + "label": "intel-broadcast-suite", + "senders": ["v"], + "senders_count": [1], + "receivers": ["v"], + "receivers_count": [0], + "device_tags": { + "pipeline": ["tx"] + }, + "function": "tx", + "gpu_hw_acceleration": "none", + "domain": "default.svc.cluster.local", + "ffmpeg_grpc_server_address": "tiber-broadcast-suite-tx.default.svc.cluster.local", + "ffmpeg_grpc_server_port": "", + "sender_payload_type":112, + "sender": [{ + "stream_payload": { + "video": { + "frame_width": 1920, + "frame_height": 1080, + "frame_rate": { "numerator": 60, "denominator": 1 }, + "pixel_format": "yuv422p10le", + "video_type": "rawvideo" + }, + "audio": { + "channels": 2, + "sampleRate": 48000, + "format": "pcm_s24be", + "packetTime": "1ms" + } + }, + "stream_type": { + "st2110" : { + "transport" : "st2110-20", + "payloadType" : 112 + } + } + }], + "receiver": [{ + "stream_payload": { + "video": { + "frame_width": 1920, + "frame_height": 1080, + "frame_rate": { "numerator": 60, "denominator": 1 }, + "pixel_format": "yuv422p10le", + "video_type": "rawvideo" + }, + "audio": { + "channels": 2, + "sampleRate": 48000, + "format": "pcm_s24be", + "packetTime": "1ms" + } + }, + "stream_type": { + "file": { + "path": "/videos", + "filename": "1920x1080p10le_1.yuv" + } + } + }] + } + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nmos-client-tx + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app: nmos-client-tx + template: + metadata: + labels: + app: nmos-client-tx + spec: + containers: + - name: nmos-client-tx + image: nmos-cpp-node:1.2A-f549712 + ports: + - containerPort: 1084 + env: + - name: RUN_NODE + value: "TRUE" + - name: VFIO_PORT_TX + value: "${VFIO_PORT_TX}" + - name: VFIO_PORT_RX + value: "${VFIO_PORT_RX}" + volumeMounts: + - name: nmos-node-config-tx + mountPath: /home/node.json + subPath: node.json + resources: + requests: + cpu: 1 + memory: 500Mi + limits: + cpu: 1 + memory: 500Mi + securityContext: + readOnlyRootFilesystem: true + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + capabilities: + drop: + - ALL + readinessProbe: + httpGet: + path: / + port: 50051 + host: tiber-broadcast-suite-tx.default.svc.cluster.local + initialDelaySeconds: 5 + periodSeconds: 10 + volumes: + - name: nmos-node-config-tx + configMap: + name: nmos-node-config-tx + +--- +apiVersion: v1 +kind: Service +metadata: + name: nmos-client-tx + namespace: default +spec: + type: NodePort + selector: + app: nmos-client-tx + ports: + - protocol: TCP + port: 1084 + targetPort: 1084 + name: nmos-client-tx-node-port-http + nodePort: 30084 + - protocol: TCP + port: 50051 + targetPort: 50051 + name: grpc-client-to-ffmpeg + nodePort: 30051 \ No newline at end of file diff --git a/nmos/k8s/bcs/nmos-client.yaml b/nmos/k8s/bcs/nmos-client.yaml deleted file mode 100644 index 7785b545..00000000 --- a/nmos/k8s/bcs/nmos-client.yaml +++ /dev/null @@ -1,94 +0,0 @@ -#SPDX-FileCopyrightText: Copyright (c) 2024 Intel Corporation -# -#SPDX-License-Identifier: BSD-3-Clause - ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: nmos-node-config -data: - node.json: | - { - "logging_level": 0, - "http_port": 1084, - "label": "intel-broadcast-suite", - "senders": ["v","d"], - "senders_count": [2, 1], - "receivers": ["v"], - "receivers_count": [4], - "device_tags": { - "pipeline": ["multiviewer"] - }, - "frame_rate": { "numerator": 60, "denominator": 1 }, - "frame_width": 1920, - "frame_height": 1080, - "video_type": "video/jxsv", - "domain": "default.svc.cluster.local", - "ffmpeg_grpc_server_address": "", - "ffmpeg_grpc_server_port": "50051" - } - ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: nmos-client -spec: - replicas: 1 - selector: - matchLabels: - app: nmos-client - template: - metadata: - labels: - app: nmos-client - spec: - containers: - - name: nmos-client - image: nmos-cpp-node:1.2A-f549712 - ports: - - containerPort: 1084 - env: - - name: RUN_NODE - value: "TRUE" - volumeMounts: - - name: nmos-node-config - mountPath: /home/node.json - subPath: node.json - resources: - requests: - cpu: 1 - memory: 100Mi - limits: - cpu: 1 - memory: 100Mi - securityContext: - readOnlyRootFilesystem: true - runAsNonRoot: false - allowPrivilegeEscalation: false - seccompProfile: - type: RuntimeDefault - capabilities: - drop: - - ALL - volumes: - - name: nmos-node-config - configMap: - name: nmos-node-config - ---- -apiVersion: v1 -kind: Service -metadata: - name: nmos-client -spec: - type: NodePort - selector: - app: nmos-client - ports: - - protocol: TCP - port: 1084 - targetPort: 1084 - name: nmos-client-node-port-http - nodePort: 30084 diff --git a/nmos/k8s/testing-dev/nmos-is-05-controller.yaml b/nmos/k8s/testing-dev/nmos-is-05-controller.yaml new file mode 100644 index 00000000..adaa51f6 --- /dev/null +++ b/nmos/k8s/testing-dev/nmos-is-05-controller.yaml @@ -0,0 +1,28 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: nmos-is05-controller-job + namespace: default +spec: + template: + spec: + containers: + - name: nmos-is05-controller + image: nmos-is05-controller:latest + env: + - name: RECEIVER_IP + value: "localhost" + - name: RECEIVER_PORT + value: "90" + - name: SENDER_IP + value: "localhost" + - name: SENDER_PORT + value: "95" + ports: + - containerPort: 90 + - containerPort: 95 + securityContext: + readOnlyRootFilesystem: true + restartPolicy: Never + backoffLimit: 10 + diff --git a/nmos/k8s/testing/nmos-registry.yaml b/nmos/k8s/testing-dev/nmos-sample-registry.yaml similarity index 97% rename from nmos/k8s/testing/nmos-registry.yaml rename to nmos/k8s/testing-dev/nmos-sample-registry.yaml index 06e754b0..e5b12c30 100644 --- a/nmos/k8s/testing/nmos-registry.yaml +++ b/nmos/k8s/testing-dev/nmos-sample-registry.yaml @@ -10,6 +10,7 @@ data: registry.json: | { "pri": 99, + "domain": "default.svc.cluster.local", "logging_level": -20, "http_trace": false, "label": "nmos-registry", diff --git a/nmos/k8s/testing/nmos-testing.yaml b/nmos/k8s/testing-dev/nmos-testing.yaml similarity index 100% rename from nmos/k8s/testing/nmos-testing.yaml rename to nmos/k8s/testing-dev/nmos-testing.yaml