全部產品
Search
文件中心

Container Service for Kubernetes:為Nginx Ingress配置WebSocket服務

更新時間:Oct 23, 2025

對於依賴WebSocket長串連的即時應用,為避免Nginx Ingress預設逾時導致串連中斷,可通過配置逾時註解保證串連穩定。

核心樣本

Nginx Ingress 的預設逾時設定專為短串連設計,在暴露WebSocket等長串連應用(如線上遊戲、即時資料看板)時,可能導致串連意外中斷。為確保串連穩定,必須通過Ingress註解(Annotations)調整逾時參數以支援 WebSocket 服務。

  • nginx.ingress.kubernetes.io/proxy-read-timeout:設定Ingress從後端服務讀取響應的逾時時間(預設值60秒)。此逾時是指兩次成功讀取操作之間的最大間隔時間,而非完成整個響應傳輸的總時間。推薦設定成1小時或更長。

  • nginx.ingress.kubernetes.io/proxy-send-timeout:設定Ingress向後端服務發送請求的逾時時間(預設值60秒)。此逾時是指兩次成功寫入操作之間的最大間隔時間,而非完成整個請求傳輸的總時間。推薦設定成1小時或更長。

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"
  name: ws
spec:
  ingressClassName: nginx
  #...

部署WebSocket樣本應用

在叢集內部署一個WebSocket回聲服務,具體範例程式碼可參考websocket-echo-server

控制台

  1. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 無狀態

  2. 無狀態頁面,單擊使用YAML建立資源,然後將以下內容複寫到模板地區,單擊建立

    樣本應用YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: ws
      name: websocket-server
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ws
      template:
        metadata:
          labels:
            app: ws
        spec:
          containers:
          - image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/websocket-echo-server:latest
            imagePullPolicy: IfNotPresent
            name: echo
            env:
             - name: BIND_PORT
               value: "3000"
            ports:
            - containerPort: 3000
              protocol: TCP
            resources:
              limits:
                cpu: 1000m
                memory: 1000Mi
              requests:
                cpu: 100m
                memory: 100Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: ws
      name: websocket-server
      namespace: default
    spec:
      ports:
      - name: ws
        port: 3000
        protocol: TCP
        targetPort: 3000
      selector:
        app: ws
      type: ClusterIP
  3. 在彈窗中找到目標無狀態應用,單擊查看,確認Pod狀態為Running。 

kubectl

  1. 擷取叢集KubeConfig並通過kubectl工具串連叢集

  2. 將以下YAML內容儲存為websocket.yaml檔案。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: ws
      name: websocket-server
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ws
      template:
        metadata:
          labels:
            app: ws
        spec:
          containers:
          - image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/websocket-echo-server:latest
            imagePullPolicy: IfNotPresent
            name: echo
            env:
             - name: BIND_PORT
               value: "3000"
            ports:
            - containerPort: 3000
              protocol: TCP
            resources:
              limits:
                cpu: 1000m
                memory: 1000Mi
              requests:
                cpu: 100m
                memory: 100Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: ws
      name: websocket-server
      namespace: default
    spec:
      ports:
      - name: ws
        port: 3000
        protocol: TCP
        targetPort: 3000
      selector:
        app: ws
      type: ClusterIP
  3. 部署WebSocket應用,並建立服務(Service)。

    kubectl apply -f websocket.yaml
  4. 確認目標應用Pod狀態為Running

    kubectl get pod | grep websocket-server

配置Ingress暴露服務

為Ingress設定代理髮送逾時時間代理讀取逾時時間規則。

  1. 登入Container Service管理主控台,單擊目的地組群名稱,在叢集詳情頁左側導覽列選擇组件管理

  2. 在搜尋方塊輸入Nginx Ingress Controller並定位組件,然後在目標組件卡片單擊安裝

    v1.2之前版本的組件已不再維護,請升級Nginx Ingress Controller組件至最新版。
  3. 配置Ingress路由轉寄及逾時註解。

    控制台

    1. 在左側導覽列,選擇網路 > 路由。選擇default命名空間,單擊建立 Ingress

    2. 添加以下Ingress配置,單擊確定

      • 網關類型:選擇Nginx Ingress

      • 名稱ws

      • 網域名稱test.example.com

      • 路徑映射路徑/匹配規則預設(ImplementationSpecific)服務名稱websocket-server連接埠3000

      • 註解:名稱:nginx.ingress.kubernetes.io/proxy-read-timeout,值:3600,名稱:nginx.ingress.kubernetes.io/proxy-send-timeout,值:3600

    3. 路由列表頁,查看建立的Ingress,擷取訪問端點地址。

      Nginx Ingress配置生效大約需要10秒,可稍後單擊重新整理按鈕擷取端點資訊。若長時間未更新端點資訊,可單擊路由名稱,進入事件頁簽,進行異常問題排查

    kubectl

    1. 將以下YAML內容儲存為websocket-ingress.yaml,然後執行kubectl apply -f websocket-ingress.yaml命令。

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        annotations:
          nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"  # 代理讀取逾時時間:3600秒
          nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"  # 代理髮送逾時時間:3600秒
        name: ws
        namespace: default
      spec:
        ingressClassName: nginx
        rules:
        - host: test.example.com           # 服務的訪問網域名稱
          http:
            paths:
            - backend:
                service:
                  name: websocket-server   # 上一步中建立的Service名稱
                  port:
                    number: 3000           # 上一步中建立的Service暴露連接埠
              path: /
              pathType: ImplementationSpecific
    2. 擷取訪問端點地址。Ingress IP分配會有延遲,若無輸出結果,可等待10秒後重試。

      ADDRESS=$(kubectl get ingress ws -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
      echo $ADDRESS

訪問WebSocket服務

  1. 為便於測試,以下提供本地區名映射方法。

    • macOS / Linuxsudo vi /etc/hosts

    • Windows: 以管理員身份開啟記事本,然後開啟 C:\Windows\System32\drivers\etc\hosts

    將以下地址替換為實際訪問端點地址,在檔案末尾添加以下網域名稱映射記錄並儲存。

    47.102.XX.XX test.example.com
  2. 安裝websocat工具,使用WS(WebSocket)協議或WSS(WebSocket Secure)協議訪問服務。

    WS協議

    使用WS協議訪問WebSocket服務。

    websocat ws://test.example.com

    串連成功後,程式會持續等待輸入。可輸入任意文本並按斷行符號。如果服務正常,發送的內容將在下一行被原樣輸出。

    2

    WSS協議

    使用WSS協議訪問服務時,需額外為Nginx Ingress Controller開啟HTTPS訪問。

    1. 購買或產生SSL認證。

    2. (可選)若已從阿里雲購買認證,需下載SSL認證檔案到本地。

    3. 建立Secret,儲存認證及私密金鑰。

      控制台

      1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

      2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇組態管理 > 保密字典

      3. 保密字典頁面,選擇default命名空間後,單擊左側建立,在彈出面板中配置新的保密字典。配置完成後,單擊確定

        • 名稱nginx-ingress-tls

        • 類型TLS認證

        • 認證:認證檔案(.crt.pem)中的完整內容

        • 密鑰:私密金鑰檔案(.key)中的完整內容

      kubectl

      將以下<PUBLIC_CERT> <PRIVATE_KEY>替換成實際的認證檔案(.crt.pem)路徑和私密金鑰檔案(.key)路徑,然後執行命令將認證和私密金鑰儲存為Secret。

      # --key 參數指定私密金鑰檔案,--cert 參數指定認證檔案
      kubectl create secret tls nginx-ingress-tls --cert <PUBLIC_CERT> --key <PRIVATE_KEY>
    4. 更新Ingress,引用上一步建立的Secret。

      控制台

      1. 在左側導覽列,選擇網路 > 路由。選擇default命名空間,單擊目標Ingress右側操作列的更新

      2. 添加以下Ingress配置,單擊確定

        • TLS配置:開啟。網域名稱test.example.com保密字典nginx-ingress-tls

      kubectl

      ws路由添加TLS配置。

      • 網域名稱test.example.com

      • 認證Secretnginx-ingress-tls

      kubectl patch ingress ws -p '{"spec":{"tls":[{"hosts":["test.example.com"],"secretName":"nginx-ingress-tls"}]}}'
    5. 基於WSS協議串連WebSocket服務。

      當服務採用自我簽署憑證時,需使用 -k 參數以跳過認證驗證。若服務採用受信任CA簽發的認證,無需額外參數。
      websocat wss://test.example.com

      串連成功後,程式會持續等待輸入。可輸入任意文本並按斷行符號。如果服務正常,發送的內容將在下一行被原樣輸出。

      4

常見問題

如何產生自我簽署憑證?

執行以下命令可產生一個網域名稱為test.example.com、有效期間為365天的自我簽署憑證(ws.crt)和私密金鑰(ws.key)。

openssl req -x509 -newkey rsa:2048 -keyout ws.key -out ws.crt -days 365 -nodes \
  -subj "/CN=test.example.com" \
  -addext "subjectAltName=DNS:test.example.com"
重要

自我簽署憑證缺乏權威 CA 認證,瀏覽器及各類用戶端預設不予信任,使用者訪問時將觸發安全警告,請勿在生產環境中使用。

SSL認證和TLS認證的區別?

SSL (Secure Sockets Layer) 為早期的加密協議,現已被更安全的TLS (Transport Layer Security) 協議取代。

在行業術語中,“SSL認證”已成為一個習慣性描述,其更準確的名稱應為“TLS認證”。

相關文檔