k8s-ingress配置websocket支持

摘要:
问题分析显示websocket链接错误2001CopyWebSocketconnectionto'ws://******************'失败ErrorduringWebSocketethandshake:意外响应代码:200猜测原因和响应方法后端服务的某些筛选器或拦截器与ws协议不兼容检查后端服务的筛选器或拦截程序代码

问题分析

表现形式

websocket链接 报错 200

1
Copy
WebSocket connection to 'ws://*********' faile Error during WebSocket handshake: Unexpected response code: 200

猜测引起原因以及应对方式

  • 后端服务某些filter或者interceptor不兼容ws协议
    排查后端服务的filter 或者interceptor 代码
    实在不行 将websocket地址给放开限制

  • 流量入口没有兼容ws协议访问 如nginx未配置ws协议支持
    nginx反向代理要配置一些参数 来达到转发 websocket请求

    1
    2
    3
    4
    5
    
    Copy
    location /websocket地址 {
      proxy_pass http://websocket服务;
      proxy_set_header Upgrade "websocket";
      proxy_set_header Connection "Upgrade";
    }
    

解决方案

由于k8s集群入口是通过边缘路由(ingress)来管理的 会存在如下的坑

  • 额外的配置 只能配置在 ingress的 metadata中 这样在一个ingress中会全部生效

那么这个时候有两种方案 来解决

1: ingress转发tcp 内部增加一个nginx 进行分发

略。。。 因为这个方案 为认为是回避了k8s的原则 不使用此方案 理论上 这个方案是很好做的 就是有点违背k8s的玩法

2: 配置一个新的单独为所有websocket服务服务的ingress

参考文档:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#configuration-snippet
新增一个配置如下的ingress 文件名为 websocket-ingress.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Copy
apiVersion: extensions/v1beta1     
kind: Ingress    
metadata:           
  name: ingress名称
  namespace: ingress所属命名空间
  annotations:           
    #ingress使用那种软件 
    kubernetes.io/ingress.class: nginx
    #配置websocket 需要的配置   
    nginx.ingress.kubernetes.io/configuration-snippet: |
       proxy_set_header Upgrade "websocket";
       proxy_set_header Connection "Upgrade";
spec:      
  rules: 
  - host: 识别的域名
    http:
      paths: 
        #代理websocket服务
      - path: /websocket地址
        backend:
          serviceName: websocket服务名称
          servicePort: websocket服务端口

启动该ingress

1
Copy
kubectl apply -f websocket-ingress.yaml

免责声明:文章转载自《k8s-ingress配置websocket支持》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Windows 服务器初始化基本安全设置tomcat查看GC信息下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

eureka服务列表刷新设置

服务器:当我们启用服务使用者时,它将向服务注册中心发送一个rest请求,以获取上面注册的服务列表。出于性能原因,eureka服务器将维护一个只读缓存服务列表以返回到客户端。默认情况下,缓存列表将每30秒更新一次。如果关闭UseReadOnlyResponseCache,服务器:#将不会读取只读缓存服务列表,因为每30秒刷新一次很慢,所以读/写缓存过期策略Us...

element-ui的el-table和el-form嵌套使用表单校验

在表单中嵌套和使用表单来验证表单是el表自动获取的后台数据,每行都有el输入验证,因此一条规则的规则不能匹配每行。因此,如果动态属性和规则规则需要如下,则验证警报阈值是无用的。上述代码˂el-table:data=“...

微信扫码网页登录,redirect_uri参数错误解决方法

对于微信开放平台[管理中心/应用程序详细信息]中设置的[开发信息][授权回调域],只需填写域名,无需https://,也无需特定页面。您不需要填写完整的请求路径,如图所示:https://open.weixin.qq.com/connect/qrconnect?appid=您的APPID&direct_Uri=回调和响应的特定地址_type=code...

爱快路由器的一些注意事项硬件配置+多线负载均衡

以下数据仅供参考:注意:磁带载体的数量因使用环境和带宽大小的不同而不同。此外,请注意32位系统的安装。最大内存为4G,最大内存为3G-----硬盘------安装“爱快路由”时对硬盘的最低要求为1G以上。...

c# Socket心跳试验,自定义发送包 和 使用KeepAlive

我记录了我心跳的位置,但WireShark无法检测到正在发送的消息,主要是因为发送的数据大小为0。如果网络电缆被拔掉,下次检测到心跳时就会报告错误。虽然这种方法可以检测套接字是否断开,但它不是很好,响应也不及时。当使用KeepAlive时,WireShark通常会检测到它不停地向Socket服务器发送消息,即心跳检测。图:通过三次握手(前三次握手)建立连接后...

部署springboot+vue项目文档(若依ruoyi项目部署步骤)

1: 部署Linux+nginx部署背景代码1.1因为我使用了idea工具进行开发,所以终端中的mvnclean包生成了相应的jar包。这个jar包可以在相应文件所在目录的目标中找到。linux服务器需要加载redis和nginx。redis存储缓存数据,nginx用于代理前端和后端服务。打包vue项目并将dist文件复制到tomcat的webapps目录中...