Kubernetes Ingress 可将集群内部的 Service 通过 HTTP/HTTPS 的方式暴露供外部访问,并通过路径匹配规则定义服务的路由。但是 Ingress 对 TCP/UDP 的服务却支持的不那么好。如果我们服务中有使用 Websocket 或 Socket, 需要暴露给外部访问,在 Kubernetes 中该如何配置呢? 大致有两种方式[见参考文档1]:
使用 NodePort 将端口直接暴露,需要节点有外网 IP,且该方式可能绕过现有的 TLS, 存在安全性的问题。 ClusterIp 只能在集群内部访问,由 Ingress 进行代理对外暴露,但对于 TCP/UDP, Ingress 不支持直接代理, 需要借助 ConfigMap 进行映射。 NodePort 的方式比较简单, 本文介绍 ClusterIp + Ingress + ConfigMap 的方式。 创建 ClusterIp 服务假设有一个 Websocket/Socket 服务,暴露端口 8828, 针对该服务定义 ClusterIp 配置如下(不声明 type, 默认即为 ClusterIp), 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, [root@kmaster k8s-deploy]# kubectl apply -f my-websocket-svc.yaml 创建 ConfigMap在 ingress-nginx-controller 所在的 namespace 下创建 ConfigMap(如果已经有 ConfigMap 了, 则可在已有 ConfigMap 的 data 部分添加下面配置中的 data 条目) apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: ingress-nginx data: 8828: "develop/my-websocket-svc:8828" data 部分的格式为: 创建 ConfigMap, [root@kmaster k8s-deploy]# kubectl apply -f tcp-service-configmap.yaml 配置 ingress-nginx-controller修改 ingress-nginx-controller 的配置, [root@kmaster ~]# kubectl edit deploy ingress-nginx-controller -n ingress-nginx 在 在
保存,应用配置更新,nginx-ingress-controller 将会自动重启 Pod,使配置生效。 验证在 nginx-ingress-controller Pod 所在节点上执行如下命令查看是否监听了 TCP 端口, 如上,8828 端口已被 nginx-ingress 监听。 对于 Websocket 应用, 可使用 wscat 进行调试 C:\Users\Administrator>wscat -c ws://域名:8828 Connected (press CTRL+C to quit) >
其它
参考文档:
[转载请注明出处] |
|