如何在 Ingress Nginx 中设置 RTMP 协议?

How to set up RTMP protocol in Ingress Nginx?

我在 Google Kubernetes Engine 上设置了一个 Kubernetes 集群。我有一个托管 RTMP 应用程序的 pod。此应用程序需要两个端口,一个用于 HTTP,一个用于 RTMP。我已经设置了一个入口 Nginx 负载平衡器。它正确路由 HTTP 流量。我也希望能够路由 RTMP 流量。但是当我在我的 YAML 文件中写入 RTMP 时。它显示为未知字段。我正在使用 skaffold 和 Google Cloud Build 进行部署。

这是 Ingress-srv 文件

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
  rules:
    - http:
        paths:
          - path: /?(.*)
            backend:
              serviceName: stream-server-srv
              servicePort: 8000

我想要做的是在端口 1935 上有一个 RTMP 条目。然后我可以使用它来使用 RTMP 协议流式传输爱情视频。

RTMP 是一种 TCP-based 协议,标准 Ingress 不支持 TCP 服务。

NGINX Ingress 控制器(看起来您正在使用)可以 be configured to expose TCP services

首先,您需要确保在 stream-server-srv 服务中公开 HTTP 和 RTMP 端口:

apiVersion: v1
kind: Service
metadata:
  name: stream-server-srv
  namespace: default
spec:
  selector:
    app: stream-server
  type: ClusterIP
  ports:
    - name: http-port
      port: 8000
      targetPort: 8000
      protocol: TCP
    - name: rtmp-port
      port: 1935
      targetPort: 1935
      protocol: TCP

(将默认值替换为您的命名空间)

您还需要确保 Service used to expose the NGINX ingress 也公开端口 1935。例如:

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  externalTrafficPolicy: Local
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - appProtocol: http
    name: http
    port: 80
    protocol: TCP
    targetPort: http
  - appProtocol: https
    name: https
    port: 443
    protocol: TCP
    targetPort: https
  - name: rtmp
    port: 1935
    protocol: TCP
    targetPort: 1935
  selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  type: LoadBalancer

最后,您需要更新/修补 NGINX tcp 服务 ConfigMap:

kubectl patch configmap tcp-services -n ingress-nginx --patch '{"data":{"1935":"default/stream-server-srv:1935"}}'

(将“default/stream-server-srv”替换为您的namespace/servicename)