kubernetes 中服务之间的 websocket 连接

Kra*_*ebr 6 websocket kubernetes

我在 Kubernetes (k3s) 中有两个服务,一个是后端,另一个是前端,我需要通过 websocket 将数据从后端传输到前端。当我在 docker-compose 中调试时它可以工作。因此,当在后端 docker-compose 中运行时,我有(python):

import websockets
...
start_server = websockets.serve(server, "0.0.0.0", 8001)
...
Run Code Online (Sandbox Code Playgroud)

在前面我有(html):

...
var ws = new WebSocket('ws://localhost:8001');
...
Run Code Online (Sandbox Code Playgroud)

我有关闭功能:

        ws.onclose = function (e) {
            document.getElementById("textArea").innerHTML = 'Socket is closed. Reconnect will be attempted in 5 seconds...' + e.reason;
            setTimeout(function () {
                connect();
            }, 5000);
        };
Run Code Online (Sandbox Code Playgroud)

它的工作原理应该是这样的。

当我使用 k3s 时我得到Socket is closed. Reconnect will be attempted in 5 seconds...

这是我的后端(应用程序)部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
  namespace: my-namespace
  labels:
    app: app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
        name: app
    spec:
      containers:
        - args:
            - python3.9
            - main.py
          image: app
          imagePullPolicy: Never
          name: app
          ports:
            - name: app
              containerPort: 8001
Run Code Online (Sandbox Code Playgroud)

以及后端的服务清单:

apiVersion: v1
kind: Service
metadata:
  name: app-service
  namespace: my-namespace
  labels:
    app: app-service
spec:
  type: ClusterIP
  ports:
    - port: 8001
      targetPort: app
  selector:
    app: app
Run Code Online (Sandbox Code Playgroud)

我的前端部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-deployment
  namespace: my-namespace
  labels:
    app: frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
        name: frontend
    spec:
      containers:
        - args:
            - python3.9
            - -m
            - uvicorn
            - main:app
            - --reload
            - --port
            - "8000"
            - --host
            - 0.0.0.0
          image: frontend
          imagePullPolicy: Never
          name: frontend
          ports:
            - name: frontend
              containerPort: 8000
Run Code Online (Sandbox Code Playgroud)

前端服务:

apiVersion: v1
kind: Service
metadata:
  name: frontend-service
  namespace: my-namespace
  labels:
    app: frontend
spec:
  type: ClusterIP 
  ports:
    - protocol: TCP
      port: 8000
      targetPort: frontend
  selector:
    app: frontend
Run Code Online (Sandbox Code Playgroud)

我有入口控制器(traefic)将流量路由到集群:

apiVersion: networking.k8s.io/v1 
kind: Ingress
metadata:
  name: traefik-ingress
  namespace: my-namespace
  annotations:
    kubernetes.io/ingress.class: traefik
    ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
    - host: my-dns.ca
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: frontend-service
              port:
                number: 8000
Run Code Online (Sandbox Code Playgroud)

我这样修改了html中的代码:

var ws = new WebSocket('ws://app-service.my-namespace.svc.cluster.local:8001');
Run Code Online (Sandbox Code Playgroud)

但得到````套接字已关闭。将在 5 秒后尝试重新连接...```

如何获取服务之间的连接或调试连接?