Python Socket.IO с FastAPI в ошибках Kubernetes 499 и 426Python

Программы на Python
Ответить
Anonymous
 Python Socket.IO с FastAPI в ошибках Kubernetes 499 и 426

Сообщение Anonymous »

Я пытаюсь настроить сервер Socketio, но у меня возникают проблемы с клиентским соединением: появляется ошибка 499 или 426.
Я попробовал переадресацию портов из модуля в мой локальный и выполнил команду Curl, которая также, похоже, не завершилась, они застряли на неопределенный срок, не зная, что я делаю неправильно, используя тот же вход для развертывания приложения fastapi на порту 8000 в другом модуле, но в том же домене, и это, кажется, работает полностью нормально, но соединение с сокетом не установлено.
ingress.yaml

Код: Выделить всё

---
apiVersion: v1
kind: ConfigMap
metadata:
name: websocket-headers
namespace: duck-backend
data:
Connection: "$connection_upgrade"
Upgrade: "$http_upgrade"
Host: "$host"
X-Real-IP: "$remote_addr"
X-Forwarded-For: "$proxy_add_x_forwarded_for"
X-Forwarded-Proto: "$scheme"
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: duck-backend-ingress
namespace: duck-backend
annotations:
kubernetes.io/ingress.class: 'nginx'
cert-manager.io/cluster-issuer: 'letsencrypt-prod'

nginx.ingress.kubernetes.io/proxy-http-version: "1.1"
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-buffering: "off"
nginx.ingress.kubernetes.io/proxy-request-buffering: "off"
nginx.ingress.kubernetes.io/proxy-set-headers: 'duck-backend/websocket-headers'

spec:
ingressClassName: nginx
tls:
- hosts:
- example.com
secretName: race1-tls
rules:
- host: example.com
http:
paths:
- path: /socket.io
pathType: Prefix
backend:
service:
name: socketio-service
port:
number: 8001
- path: /
pathType: Prefix
backend:
service:
name: fastapi-service
port:
number: 8000
socketio.yaml

Код: Выделить всё

apiVersion: apps/v1
kind: Deployment
metadata:
name: socketio
namespace: duck-backend
spec:
replicas: 1
selector:
matchLabels:
app: socketio
template:
metadata:
labels:
app: socketio
spec:
containers:
- name: socketio
image: duck-backend:latest
command: ["./docker/entrypoint-k8s.sh", "socket-io"]
ports:
- containerPort: 8001
envFrom:
- configMapRef:
name: duck-backend-config
- secretRef:
name: duck-backend-secrets
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "1Gi"
cpu: "1000m"
---
apiVersion: v1
kind: Service
metadata:
name: socketio-service
namespace: duck-backend
spec:
selector:
app: socketio
ports:
- port: 8001
targetPort: 8001
type: ClusterIP
main.py

Код: Выделить всё

app = FastAPI(title="Socket.IO Server")

app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)

sio = socketio.AsyncServer(
async_mode='asgi',
cors_allowed_origins='*',
client_manager=manager,
logger=True,
engineio_logger=True
)

@sio.on('*')
def any_event(event, sid, data):
print('*', event, sid)

@sio.event
def connect(sid, environ, auth):
print('connect ', sid)

@sio.event
def disconnect(sid, reason):
print('disconnect ', sid, reason)

uvicorn.run(socketio.ASGIApp(sio, app), host="0.0.0.0", port=8001)

sysout

Код: Выделить всё

Starting service: socket-io
Starting Socket.IO service on port 8001...
Server initialized for asgi.
2025-09-19 16:20:48,983 - app.api.v1.socket_events.balance_update - INFO - Starting Socket.IO server...
INFO:     Started server process [1]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:      Uvicorn running on http://0.0.0.0:8001 (Press CTRL+C to quit)
2025-09-19 16:21:25,682 - engineio.server - INFO - TQFnIo5NlfhS4P9bAAAA: Sending packet OPEN data {'sid': 'TQFnIo5NlfhS4P9bAAAA', 'upgrades': ['websocket'], 'pingTimeout': 20000, 'pingInterval': 25000, 'maxPayload': 1000000}
TQFnIo5NlfhS4P9bAAAA: Sending packet OPEN data {'sid': 'TQFnIo5NlfhS4P9bAAAA', 'upgrades': ['websocket'], 'pingTimeout': 20000, 'pingInterval': 25000, 'maxPayload': 1000000}
В выводе в основном отображается только 426 требуемого обновления, но запрос из браузера показывает, что заголовки соединения и обновления находятся в запросе.
client.html

Код: Выделить всё



Socket.IO Test Client



Socket.IO Test
Connecting...

// Replace with your actual endpoint and port
const socket = io("https://example.com", {
path: "/socket.io/",
transports: ['websocket', 'polling'],
secure: true
});

socket.on("connect", () => {
document.getElementById("status").innerText = "Connected: " + socket.id;
});

socket.on("disconnect", () => {
document.getElementById("status").innerText = "Disconnected";
});

// Example: Listen for custom events
socket.on("your_event", (data) => {
console.log("Received:", data);
});

// Example: Emit a test event
socket.emit("test", { msg: "Hello from client!" });




Похоже, что либо заголовки не доходят до приложения, либо приложение отклоняет запросы, не знаю почему
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»