1. 程式人生 > >在 Kubernetes Ingress 中支援 Websocket/Socket 服務

在 Kubernetes Ingress 中支援 Websocket/Socket 服務

Kubernetes Ingress 可將叢集內部的 Service 通過 HTTP/HTTPS 的方式暴露供外部訪問,並通過路徑匹配規則定義服務的路由。但是 Ingress 對 TCP/UDP 的服務卻支援的不那麼好。如果我們服務中有使用 Websocket 或 Socket, 需要暴露給外部訪問,在 Kubernetes 中該如何配置呢? 大致有兩種方式[見參考文件1]: 1. 使用 NodePort, 使用節點 IP 與 NodePort 暴露的埠訪問 2. 使用 ClusterIp + Ingress + ConfigMap 使用 NodePort 將埠直接暴露,需要節點有外網 IP,且該方式可能繞過現有的 TLS, 存在安全性的問題。 ClusterIp 只能在叢集內部訪問,由 Ingress 進行代理對外暴露,但對於 TCP/UDP, Ingress 不支援直接代理, 需要藉助 ConfigMap 進行對映。 NodePort 的方式比較簡單, 本文介紹 ClusterIp + Ingress + ConfigMap 的方式。 ## 建立 ClusterIp 服務 假設有一個 Websocket/Socket 服務,暴露埠 8828, 針對該服務定義 ClusterIp 配置如下(不宣告 type, 預設即為 ClusterIp), ```yaml apiVersion: v1 kind: Service metadata: name: my-websocket-svc namespace: develop spec: ports: - name: socket port: 8828 targetPort: 8828 protocol: TCP selector: app: my-websocket ``` 建立 ClusterIp, ```shell [root@kmaster k8s-deploy]# kubectl apply -f my-websocket-svc.yaml ``` ## 建立 ConfigMap 在 ingress-nginx-controller 所在的 namespace 下建立 ConfigMap(如果已經有 ConfigMap 了, 則可在已有 ConfigMap 的 data 部分新增下面配置中的 data 條目) ```yaml apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: ingress-nginx data: 8828: "develop/my-websocket-svc:8828" ``` data 部分的格式為: `