對於依賴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。
控制台
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在無狀態頁面,單擊使用YAML建立資源,然後將以下內容複寫到模板地區,單擊建立。
在彈窗中找到目標無狀態應用,單擊查看,確認Pod狀態為
Running。
kubectl
將以下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部署WebSocket應用,並建立服務(Service)。
kubectl apply -f websocket.yaml確認目標應用Pod狀態為
Running。kubectl get pod | grep websocket-server
配置Ingress暴露服務
為Ingress設定代理髮送逾時時間和代理讀取逾時時間規則。
登入Container Service管理主控台,單擊目的地組群名稱,在叢集詳情頁左側導覽列選擇组件管理。
在搜尋方塊輸入Nginx Ingress Controller並定位組件,然後在目標組件卡片單擊安裝。
v1.2之前版本的組件已不再維護,請升級Nginx Ingress Controller組件至最新版。
配置Ingress路由轉寄及逾時註解。
控制台
在左側導覽列,選擇。選擇
default命名空間,單擊建立 Ingress。添加以下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。
在路由列表頁,查看建立的Ingress,擷取訪問端點地址。
Nginx Ingress配置生效大約需要10秒,可稍後單擊重新整理按鈕擷取端點資訊。若長時間未更新端點資訊,可單擊路由名稱,進入事件頁簽,進行異常問題排查。
kubectl
將以下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擷取訪問端點地址。Ingress IP分配會有延遲,若無輸出結果,可等待10秒後重試。
ADDRESS=$(kubectl get ingress ws -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo $ADDRESS
訪問WebSocket服務
為便於測試,以下提供本地區名映射方法。
macOS / Linux:
sudo vi /etc/hosts。Windows: 以管理員身份開啟記事本,然後開啟
C:\Windows\System32\drivers\etc\hosts。
將以下地址替換為實際訪問端點地址,在檔案末尾添加以下網域名稱映射記錄並儲存。
47.102.XX.XX test.example.com安裝websocat工具,使用WS(WebSocket)協議或WSS(WebSocket Secure)協議訪問服務。
WS協議
使用WS協議訪問WebSocket服務。
websocat ws://test.example.com串連成功後,程式會持續等待輸入。可輸入任意文本並按斷行符號。如果服務正常,發送的內容將在下一行被原樣輸出。

WSS協議
使用WSS協議訪問服務時,需額外為Nginx Ingress Controller開啟HTTPS訪問。
購買或產生SSL認證。
(可選)若已從阿里雲購買認證,需下載SSL認證檔案到本地。
建立Secret,儲存認證及私密金鑰。
控制台
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在保密字典頁面,選擇
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>更新Ingress,引用上一步建立的Secret。
控制台
在左側導覽列,選擇。選擇
default命名空間,單擊目標Ingress右側操作列的更新。添加以下Ingress配置,單擊確定。
TLS配置:開啟。網域名稱:
test.example.com,保密字典:nginx-ingress-tls。
kubectl
為
ws路由添加TLS配置。網域名稱:
test.example.com。認證Secret:
nginx-ingress-tls。
kubectl patch ingress ws -p '{"spec":{"tls":[{"hosts":["test.example.com"],"secretName":"nginx-ingress-tls"}]}}'基於WSS協議串連WebSocket服務。
當服務採用自我簽署憑證時,需使用
-k參數以跳過認證驗證。若服務採用受信任CA簽發的認證,無需額外參數。websocat wss://test.example.com串連成功後,程式會持續等待輸入。可輸入任意文本並按斷行符號。如果服務正常,發送的內容將在下一行被原樣輸出。

常見問題
如何產生自我簽署憑證?
執行以下命令可產生一個網域名稱為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認證”。
相關文檔
如需瞭解在ACK中有哪些網關支援WebSocket協議,請參見Nginx Ingress、ALB Ingress和MSE Ingress對比。
如需維持較長時間的WebSocket串連,建議配置自訂逾時設定。關於自訂逾時的更多註解,請參見Custom timeouts。