nginx ingress代理websocket流量

1 概述: 1.1 环境

版本信息如下:
a、操作系统:centos 7.6
b、kubernetes版本:v1.15.0
c、ingress nginx版本:0.47.0

2 nginx ingress是否支持代理websocket流量

nginx ingress 默认支持websocket协议,因此ingress实例不需要额外配置。
值得注意的是,proxy-read-timeout和proxy-send-timeout的默认值是60秒,应该根据实际情况增加此两个参数的值。如果使用默认值60,则websocket客户端超过60秒没有给websocket服务端发送信息,再次发送数据时是无效的,例如使用websocat命令时,出现WebSocketError: I/O failure。

3 ingress样例

apiVersion: extensions/v1beta1kind: Ingressmetadata:  annotations:    # 根据实际情况调整超时时间,默认值为60    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"  name: ws  namespace: defaultspec:  rules:  - host: apigateway    http:      paths:      - backend:          serviceName: ws          servicePort: 3000        path: /

4 部署 4.1 部署nginx ingress

将以下文件进行kubectl apply,本案例中是以daemonset形式部署nginx controller,使用host网络。

apiVersion: v1kind: Namespacemetadata:  name: ingress-nginx  labels:    app.kubernetes.io/name: ingress-nginx    app.kubernetes.io/part-of: ingress-nginx---kind: ConfigMapapiVersion: v1metadata:  name: nginx-configuration  namespace: ingress-nginx  labels:    app.kubernetes.io/name: ingress-nginx    app.kubernetes.io/part-of: ingress-nginx---kind: ConfigMapapiVersion: v1metadata:  name: tcp-services  namespace: ingress-nginx  labels:    app.kubernetes.io/name: ingress-nginx    app.kubernetes.io/part-of: ingress-nginx---kind: ConfigMapapiVersion: v1metadata:  name: udp-services  namespace: ingress-nginx  labels:    app.kubernetes.io/name: ingress-nginx    app.kubernetes.io/part-of: ingress-nginx---apiVersion: v1data:  resolv.conf: |    nameserver 10.96.0.10    search default.svc.cluster.local svc.cluster.local cluster.local lj.io    options ndots:5kind: ConfigMapmetadata:  name: resolver  namespace: ingress-nginx---apiVersion: v1kind: ServiceAccountmetadata:  name: nginx-ingress-serviceaccount  namespace: ingress-nginx  labels:    app.kubernetes.io/name: ingress-nginx    app.kubernetes.io/part-of: ingress-nginx---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRolemetadata:  name: nginx-ingress-clusterrole  labels:    app.kubernetes.io/name: ingress-nginx    app.kubernetes.io/part-of: ingress-nginxrules:  - apiGroups:      - ""    resources:      - configmaps      - endpoints      - nodes      - pods      - secrets    verbs:      - list      - watch  - apiGroups:      - ""    resources:      - nodes    verbs:      - get  - apiGroups:      - ""    resources:      - services    verbs:      - get      - list      - watch  - apiGroups:      - "extensions"      - "networking.k8s.io"    resources:      - ingresses    verbs:      - get      - list      - watch      - update  - apiGroups:      - ""    resources:      - events    verbs:      - create      - patch  - apiGroups:      - "extensions"    resources:      - ingresses/status    verbs:      - update---apiVersion: rbac.authorization.k8s.io/v1beta1kind: Rolemetadata:  name: nginx-ingress-role  namespace: ingress-nginx  labels:    app.kubernetes.io/name: ingress-nginx    app.kubernetes.io/part-of: ingress-nginxrules:  - apiGroups:      - ""    resources:      - configmaps      - pods      - secrets      - namespaces    verbs:      - get  - apiGroups:      - ""    resources:      - configmaps    resourceNames:      # Defaults to "<election-id>-<ingress-class>"      # Here: "<ingress-controller-leader>-<nginx>"      # This has to be adapted if you change either parameter      # when launching the nginx-ingress-controller.      - "ingress-controller-leader-nginx"    verbs:      - get      - update  - apiGroups:      - ""    resources:      - configmaps    verbs:      - create  - apiGroups:      - ""    resources:      - endpoints    verbs:      - get---apiVersion: rbac.authorization.k8s.io/v1beta1kind: RoleBindingmetadata:  name: nginx-ingress-role-nisa-binding  namespace: ingress-nginx  labels:    app.kubernetes.io/name: ingress-nginx    app.kubernetes.io/part-of: ingress-nginxroleRef:  apiGroup: rbac.authorization.k8s.io  kind: Role  name: nginx-ingress-rolesubjects:  - kind: ServiceAccount    name: nginx-ingress-serviceaccount    namespace: ingress-nginx---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata:  name: nginx-ingress-clusterrole-nisa-binding  labels:    app.kubernetes.io/name: ingress-nginx    app.kubernetes.io/part-of: ingress-nginxroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: nginx-ingress-clusterrolesubjects:  - kind: ServiceAccount    name: nginx-ingress-serviceaccount    namespace: ingress-nginx---apiVersion: v1kind: Servicemetadata:  name: ingress-nginx  namespace: ingress-nginxspec:  ports:  - port: 80    protocol: TCP    targetPort: 80  selector:    app.kubernetes.io/name: ingress-nginx  sessionAffinity: None  type: ClusterIP---apiVersion: apps/v1kind: DaemonSetmetadata:  name: nginx-ingress-controller  namespace: ingress-nginx  labels:    app.kubernetes.io/name: ingress-nginx    app.kubernetes.io/part-of: ingress-nginxspec:  selector:    matchLabels:      app.kubernetes.io/name: ingress-nginx      app.kubernetes.io/part-of: ingress-nginx  template:    metadata:      labels:        app.kubernetes.io/name: ingress-nginx        app.kubernetes.io/part-of: ingress-nginx      annotations:        prometheus.io/port: "10254"        prometheus.io/scrape: "true"    spec:      serviceAccountName: nginx-ingress-serviceaccount      hostNetwork: true      dnsPolicy: ClusterFirstWithHostNet      containers:        - name: nginx-ingress-controller          image: bitnami/nginx-ingress-controller:0.47.0          args:            - /nginx-ingress-controller            - --configmap=$(POD_NAMESPACE)/nginx-configuration            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services            - --publish-service=$(POD_NAMESPACE)/ingress-nginx            - --annotations-prefix=nginx.ingress.kubernetes.io          securityContext:            allowPrivilegeEscalation: true            capabilities:              drop:                - ALL              add:                - NET_BIND_SERVICE            # www-data -> 33            runAsUser: 33          env:            - name: POD_NAME              valueFrom:                fieldRef:                  fieldPath: metadata.name            - name: POD_NAMESPACE              valueFrom:                fieldRef:                  fieldPath: metadata.namespace          ports:            - name: http              containerPort: 80            - name: https              containerPort: 443          livenessProbe:            failureThreshold: 3            httpGet:              path: /healthz              port: 10254              scheme: HTTP            initialDelaySeconds: 10            periodSeconds: 10            successThreshold: 1            timeoutSeconds: 10          readinessProbe:            failureThreshold: 3            httpGet:              path: /healthz              port: 10254              scheme: HTTP            periodSeconds: 10            successThreshold: 1            timeoutSeconds: 10

部署效果如下,

4.2 设置域名

在本案例中使用/etc/hosts文件解析域名,本机机器IP是192.168.0.70。

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4::1         localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.0.70 apigateway 

4.3 部署websocket服务端

服务端进程监听的端口是3000,是简单的echo server。

apiVersion: apps/v1kind: Deploymentmetadata:  labels:    app: ws  name: ws  namespace: defaultspec:  replicas: 1  selector:    matchLabels:      app: ws  template:    metadata:      labels:        app: ws    spec:      containers:      - image: elegantmonkeys/websockets-demo:latest        imagePullPolicy: IfNotPresent        name: echo        ports:        - containerPort: 3000          protocol: TCP        resources:          limits:            cpu: "0.2"            memory: 100Mi          requests:            cpu: 100m            memory: 100Mi---apiVersion: v1kind: Servicemetadata:  labels:    app: ws  name: ws  namespace: defaultspec:  ports:  - name: ws    port: 3000    protocol: TCP    targetPort: 3000  selector:    app: ws  type: NodePort

4.4 创建ingress资源

apiVersion: extensions/v1beta1kind: Ingressmetadata:  annotations:    # 根据实际情况调整超时时间,默认值为60    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"  name: ws  namespace: defaultspec:  rules:  - host: apigateway    http:      paths:      - backend:          serviceName: ws          servicePort: 3000        path: /

4.5 下载websockt客户端

cd /tmpwget -O websocat https://github.com/vi/websocat/releases/download/v1.9.0/websocat_linux64chmod 755 websocat mv websocat /usr/bin/

4.6 测试

使用websocat命令通过ingress nginx连接echo server。

5 小结:

ingress nginx默认支持websocket协议,使用长连接协议时需要注意连接超时的设置,读取和发送超时的注解参数分别是:nginx.ingress.kubernetes.io/proxy-read-timeout和nginx.ingress.kubernetes.io/proxy-send-timeout。

(0)

相关推荐

  • nginx ingress代理websocket流量的配置方法

    目录 1 概述: 1.1 环境 2 nginx ingress是否支持代理websocket流量 3 ingress样例 4 部署 4.1 部署nginx ingress 4.2 设置域名 4.3 部署websocket服务端 4.4 创建ingress资源 4.5 下载websockt客户端 4.6 测试 5 小结: 1 概述: 1.1 环境 版本信息如下:a.操作系统:centos 7.6b.kubernetes版本:v1.15.0c.ingress nginx版本:0.47.0 2 ngi

  • nginx ingress代理websocket流量

    1 概述: 1.1 环境 版本信息如下:a.操作系统:centos 7.6b.kubernetes版本:v1.15.0c.ingress nginx版本:0.47.0 2 nginx ingress是否支持代理websocket流量 nginx ingress 默认支持websocket协议,因此ingress实例不需要额外配置.值得注意的是,proxy-read-timeout和proxy-send-timeout的默认值是60秒,应该根据实际情况增加此两个参数的值.如果使用默认值60,则we

  • Nginx反向代理websocket配置实例

    最近有一个需求,就是需要使用 nginx 反向代理 websocket,经过查找一番资料,目前已经测试通过,本文只做一个记录 复制代码 代码如下: 注: 看官方文档说 Nginx 在 1.3 以后的版本才支持 websocket 反向代理,所以要想使用支持 websocket 的功能,必须升级到 1.3 以后的版本,因此我这边是下载的 Tengine 的最新版本测试的 1.下载 tengine 最近的源码 复制代码 代码如下: wget http://tengine.taobao.org/dow

  • nginx反向代理webSocket配置详解

    最近在做项目的时候用到了webSocket协议,而且是在微信小程序中用到了webSocket,微信小程序中使用wss协议的时候不能设置端口,只能使用默认的443端口.我擦,我的https已经监听了443端口,webSocket再去监听443,肯定不行啊.要想办法解决,老大把这个问题交给我了,我愉快(手动懵逼)的接收了这个任务.想到了两种办法解决.一种解决办法是把webSocket部署到另一台服务器上,这样成本也太高了.另一种办法,就是使用nginx反向代理. 因为webSocket协议是基于ht

  • 详解Nginx反向代理WebSocket响应403的解决办法

    在Nginx反向代理一个带有WebSocket功能的Spring Web程序(源代码地址 )时,发现访问WebSocket接口时总是出现403响应,Nginx的配置参考的是 官方文档 : http { // ssl 相关配置 ... map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 8020; location /ws { proxy_pass http://some-ip:8

  • Nginx实战之反向代理WebSocket的配置实例

    实现方案 采用目前比较成熟的WebSocket技术,WebSocket协议为创建客户端和服务器端需要实时双向通讯的webapp提供了一个选择.其为HTML5的一部分,WebSocket相较于原来开发这类app的方法来说,其能使开发更加地简单.大部分现在的浏览器都支持WebSocket,比如Firefox,IE,Chrome,Safari,Opera,并且越来越多的服务器框架现在也同样支持WebSocket. WebSocket集群 在实际的生产环境中,要求多个WebSocket服务器必须具有高性

  • nginx反向代理时如何保持长连接

    ·[场景描述] HTTP1.1之后,HTTP协议支持持久连接,也就是长连接,优点在于在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟. 如果我们使用了nginx去作为反向代理或者负载均衡,从客户端过来的长连接请求就会被转换成短连接发送给服务器端. 为了支持长连接,我们需要在nginx服务器上做一些配置. ·[要求] 使用nginx时,想要做到长连接,我们必须做到以下两点: 从client到nginx是长连接 从nginx到server是长连接 对于客户端而言,n

  • nginx ingress限速那些事浅析

    目录 从业务场景出发 什么是限速? 为什么要限速? 在nginx ingress的yaml文件里,都有哪些配置? 从业务场景出发 在业务开发过程中,我们有个需求是:通过filebrowser提供的下载服务需要进行限速处理.如用户在通过filebrowser进行文件下载的时候,需要限制每个用户的下载速率.从这个需求扩展开来,也可以限定特定用户的下载速率. 为了实现这个业务需求,结合我们当前的技术栈(k8s + nginx ingress),可以通过配置相应的nginx参数来实现. 什么是限速? 限

  • Nginx多层代理配置方法

    此篇只说nginx的多级代理配置,不扯其他的. 需求:hba.changyoufun.com-121.201.125.239(gd1)--hk1--co(alphaclash.ggdev.co)  广东代理--->香港--->加拿大 由于idc机房在加拿大,所以经常会配些nginx多级反向代理到国内.(不做代理client就得翻墙,或者说是丢包很严重.) 下面的Nginx配置我只写80的,443的忽略,简化nginx的配置,参数也不一一列举不然太多了. gd1的反向代理配置:(就是一个反向代理

  • Nginx反向代理一个80端口下配置多个微信项目详解

    Nginx反向代理一个80端口下配置多个微信项目详解 我们要接入微信公众号平台开发,需要填写服务器配置,然后依据接口文档才能实现业务逻辑.但是微信公众号接口只支持80接口(80端口).我们因业务需求需要在一个公众号域名下面,发布两个需要微信授权的项目,怎么办? 我们可以用nginx服务器做反向代理来解决这个问题.nginx服务器对外80端口,然后根据URL参数不同,对内访问不同的项目. nginx配置如下: 打开/usr/local/nginx/conf/nginx.conf worker_pr

随机推荐