查看日志提示websocket 连接失败

Viewed 104

snail-job 版本:1.6.0
java 21 springboot 3.x

日志配置logback-spring.xml增加了snail-job 的日志采集,然而通过管理后台查看日志是提示websocket 连接失败,印象中在刚部署的时候是正常的,如何解决?

报错信息
image.png
image.png

日志配置
image.png

部署方式:k8s

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: snail-job-server
  name: snail-job-server
  namespace: "default"
spec:
  replicas: 1
  selector:
    matchLabels:
      run: snail-job-server
  template:
    metadata:
      labels:
        run: snail-job-server
    spec:
      containers:
        - name: snail-job-server
          image: opensnail/snail-job:1.6.0-beta1
          env:
            - name: SPRING_DATASOURCE_USERNAME
              value: "xx"
            - name: SPRING_DATASOURCE_PASSWORD
              value: "xx"
            - name: SPRING_DATASOURCE_URL
              value: "jdbc:mysql://xxx:3306/snail_job?useSSL=false&characterEncoding=utf8&useUnicode=true"
            - name: SPRING_DATASOURCE_DRIVER_CLASS_NAME
              value: "com.mysql.cj.jdbc.Driver"
            - name: TZ
              value: "Asia/Shanghai"
            - name: JAVA_OPTS
              value: "-Djava.security.egd=file:/dev/./urandom -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC"
            - name: SERVER_PORT
              value: "8080"
            - name: SNAIL_JOB_SERVER_PORT # 指定运行参数
              value: "17888"
          ports:
            - containerPort: 8080  # 容器暴露的端口
            - containerPort: 17888  # 另一个端口
          command: ["java"]
          args:
            - "-Djava.security.egd=file:/dev/./urandom"
            - "-XX:+HeapDumpOnOutOfMemoryError"
            - "-XX:+UseZGC"
            - "-jar"
            - "app.jar"
            - "--server.port=$(SERVER_PORT)"

ingress配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-read-timeout: '3600'
    nginx.ingress.kubernetes.io/proxy-send-timeout: '3600'
  labels:
    ingress-controller: nginx
  name: snail-job-admin
  namespace: default
spec:
  ingressClassName: nginx
  rules:
    - host: snail-job.dev.xxx.net
      http:
        paths:
          - backend:
              service:
                name: snail-job-server
                port:
                  number: 18080
            path: /snail-job
            pathType: ImplementationSpecific
status:
  loadBalancer:
    ingress:
      - ip: xx.xx.xx.xx

管理后台:通过ingress配置域名访问

5 Answers

初步确认是ingress 配置问题,通过ip:port 访问日志可以正常查看

补充结论:
问题原因是阿里云serverless云原生网关不支持websocket,更改为nginx ingress 后重新配置域名A记录后问题解决。

描述一下你怎么部署的

感觉ingress需要有一个ws的配置

GPT给的建议

在 Kubernetes 中配置 Ingress 以支持 WebSocket 通信,通常需要确保 Ingress 控制器和相关配置支持 WebSocket 协议。以下是一个基本的配置步骤:

确保 Ingress 控制器支持 WebSocket:
确保你使用的 Ingress 控制器(如 NGINX Ingress Controller)支持 WebSocket。大多数现代的 Ingress 控制器都支持这一功能。

配置 Ingress 资源:
在你的 Ingress 资源中,确保配置了正确的路径和服务,以便能够处理 WebSocket 请求。

下面是一个示例 Ingress 配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: websocket-ingress
  annotations:
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
spec:
  rules:
  - host: your-domain.com
    http:
      paths:
      - path: /ws
        pathType: Prefix
        backend:
          service:
            name: websocket-service
            port:
              number: 80
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: websocket-ingress
  annotations:
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
spec:
  rules:
  - host: your-domain.com
    http:
      paths:
      - path: /ws
        pathType: Prefix
        backend:
          service:
            name: websocket-service
            port:
              number: 80

在这个配置中:

nginx.ingress.kubernetes.io/proxy-read-timeout 和 nginx.ingress.kubernetes.io/proxy-send-timeout 注解用于防止 WebSocket 连接因超时而断开。
path: /ws 指定了 WebSocket 的路径。
backend 指定了处理 WebSocket 请求的服务。
验证 WebSocket 连接:
部署配置后,使用 WebSocket 客户端(如浏览器或专用工具)测试连接,确保 WebSocket 通信正常。

检查日志和调试:
如果遇到问题,查看 Ingress 控制器的日志以获取更多信息。确保服务和路径配置正确,并且没有防火墙或网络策略阻止 WebSocket 流量。

通过这些步骤,你应该能够在 Kubernetes 中配置 Ingress 以支持 WebSocket 通信。