【问题标题】:Socket.io Ingress controller on Kubernetes (Can't estabilish a connection)Kubernetes 上的 Socket.io 入口控制器(无法建立连接)
【发布时间】:2021-10-07 19:45:55
【问题描述】:

我有一个使用 socket.io 的简单 Node.js 聊天示例。我已经在本地使用 docker 容器测试了此部署,并且 Web 客户端成功连接到 websocket (socket.io)。当我尝试在带有入口控制器的 Kubernetes 集群上部署它时,就会出现问题。

我的问题是,在使用入口控制器时 特殊 socket.io 有什么特别需要的吗?

我得到的错误信息是 <<browser name>> Can't estabilish a connection to the server at ws://<<address>>/socket.io/EIO=3&transport=websocket

下面是服务器端

的简单实现
var io = socket(server);
io.on('connection', (socket)=>{
    console.log('made socket connection')
    socket.on('chat', (message)=>{
        message:message.value
    })

下面是客户端:

var socket = io.connect("http://localhost:3002", {
    upgrade: false,
    transports: ['websocket'],
    secure: True
});

我的 ingress yaml 文件如下所示

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ws-ingress
  namespace: websocket-ns
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/websocket-services: "ws-service"
    nginx.ingress.kubernetes.io/proxy-read-timeout: '3600'
    nginx.ingress.kubernetes.io/proxy-send-timeout: '3600'
    nginx.ingress.kubernetes.io/server-snippet: |
      http {
        server {
            listen 3002;
          location = / {
              proxy_set_header Upgrade "websocket";
              proxy_http_version 1.1;
              proxy_set_header X-Forwarded-Host $http_host;
              proxy_set_header X-Forwarded-Proto $scheme;
              proxy_set_header X-Forwarded-For $remote_addr;
              proxy_set_header Host $host;
              proxy_set_header Connection "upgrade";
              proxy_cache_bypass $http_upgrade;
            }
          upstream nodes {
              hash $remote_addr consistent;
              server app01:3002;
            }
      }
spec:
  rules:
    - host: "$host_address"
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: ws-service
                port:
                  number: 80

服务 yaml:

apiVersion: v1
kind: Service
metadata:
  name: ws-service
  namespace: websocket-ns
  labels:
    app: ws-service
spec:
  type: LoadBalancer
  selector:
    app: ws-app
  ports:
    - port: 80
      protocol: TCP
      targetPort: 3002

服务器部署文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ws-app
  namespace: websocket-ns
  labels:
    app: ws-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ws-app
  template:
    metadata:
      labels:
        app: ws-app
    spec:
      containers:
        - name: ws-app
          image: themuchy/socketexample
          ports:
            - containerPort: 3002
              name: ws-app

【问题讨论】:

  • 不确定你为什么在配置中添加了nginx.ingress.kubernetes.io/server-snippet 并将 HTTP 升级到 websocket。那个 nginx 控制器会自己做
  • 在入口中,您的流量进入ws-service,但在注释中您提到了另一个服务名称。
  • @HarshManvar 我在入口和注释中使用了相同的服务名称(ws-service),对不起,我只是忘记在我在这里发布问题之前更改注释中的名称(一直在尝试不同的解决方案)。

标签: kubernetes websocket socket.io kubernetes-ingress nginx-ingress


【解决方案1】:

这个正在和一个合作

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    certmanager.k8s.io/cluster-issuer: core-prod
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/secure-backends: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/websocket-services: ws-service
    nginx.org/websocket-services: ws-service
  name: core-ingress
spec:
  rules:
  - host: test.io
    http:
      paths:
      - backend:
          serviceName: ws-service
          servicePort: 80
  tls:
  - hosts:
    - test.io
    secretName: core-prod

Nginx 本身会升级 HTTP 请求并将其转换为 WebSocket。您不必添加任何相同的注释。

DeploymentserviceYAML 配置看起来不错,但请尝试删除注释 server-snippet。这样流量就会像

LB > ingress (Connection upgrade) > service > pods

【讨论】:

  • 谢谢,但这仍然无法为我工作。可能是因为我使用的是 https 而不是 SSL?
  • 对于 https,我已经添加了将在入口级别终止 https 的块,也许你检查一次
猜你喜欢
  • 1970-01-01
  • 2022-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 2020-10-11
  • 2021-01-28
  • 2018-05-14
相关资源
最近更新 更多