如何在 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)
我在 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)