Kubernetes 1.31: Streaming Transitions from SPDY to WebSockets

Bài tóm tắt Kubernetes (CNCF) 2024 4. Điều chỉnh Độ khó: Dễ

Kubernetes · 2024 · 4. Điều chỉnh · Độ khó: Dễ — bài gốc

Bài ngắn thông báo thay đổi của dự án; ít số liệu.

Bối cảnh

  • Một số endpoint của API server (exec, attach, cp, port-forward) được nâng cấp từ HTTP lên kết nối streaming hai chiều. Từ đầu, Kubernetes dùng SPDY/3.1 cho việc này.
  • SPDY đã bị bỏ khoảng 8 năm và chưa từng được chuẩn hoá. Nhiều proxy, gateway, load balancer hiện đại không hỗ trợ, nên các lệnh trên hỏng khi đi qua proxy hay gateway.

Thay đổi chính

  • Từ v1.31, kubectl mặc định dùng WebSocket (RFC 6455): client gửi Upgrade: websocket kèm subprotocol (ví dụ v5.channel.k8s.io); nếu server và container runtime hỗ trợ thì trả 101 Switching Protocols, rồi STDIN/STDOUT/STDERR, đổi cỡ terminal và mã thoát đi trên kết nối đó.
  • Chuyển dần qua nhiều bản, hai phía bật riêng:
    • Phía server: feature gate TranslateStreamCloseWebsocketRequests (exec/attach, có từ v1.29) và PortForwardWebsockets (v1.30); tới v1.31 là beta, bật mặc định.
    • Phía client: biến môi trường KUBECTL_REMOTE_COMMAND_WEBSOCKETS và KUBECTL_PORT_FORWARD_WEBSOCKETS.
    • kubectl 1.31 tự dùng hành vi mới nhưng cần cụm đã bật tính năng phía server; với cụm cũ hơn, có thể tự bật hai feature gate để thử.

Vì sao

  • Giao thức nằm giữa client và server còn phải đi qua mọi middlebox ở giữa; khi hệ sinh thái bỏ một giao thức, hệ của mình hỏng dù không đổi gì (Migration không downtime).

Bài học cho SWE

  • Đổi giao thức ở hệ có nhiều phiên bản client/server cùng tồn tại: thương lượng (subprotocol), bật từng phía bằng cờ, qua vài bản phát hành mới đổi mặc định.
  • Phụ thuộc vào một giao thức chưa chuẩn hoá là nợ kỹ thuật trả dần theo thời gian, qua những chỗ mình không kiểm soát (proxy của khách).

Liên quan