在 Kubernetes Ingress 中支持 Websocket/Socket 服务

网友投稿 668 2022-10-30

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

在 Kubernetes Ingress 中支持 Websocket/Socket 服务

Kubernetes Ingress 可将集群内部的 Service 通过 HTTP/HTTPS 的方式暴露供外部访问,并通过路径匹配规则定义服务的路由。但是 Ingress 对 TCP/UDP 的服务却支持的不那么好。如果我们服务中有使用 Websocket 或 Socket, 需要暴露给外部访问,在 Kubernetes 中该如何配置呢?

大致有两种方式[见参考文档1]:

使用 NodePort, 使用节点 IP 与 NodePort 暴露的端口访问使用 ClusterIp + Ingress + ConfigMap

使用 NodePort 将端口直接暴露,需要节点有外网 IP,且该方式可能绕过现有的 TLS, 存在安全性的问题。

ClusterIp 只能在集群内部访问,由 Ingress 进行代理对外暴露,但对于 TCP/UDP, Ingress 不支持直接代理, 需要借助 ConfigMap 进行映射。

NodePort 的方式比较简单, 本文介绍 ClusterIp + Ingress + ConfigMap 的方式。

创建 ClusterIp 服务

{% codeblock my-websocket-svc.yaml lang: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 {% endcodeblock %}

创建 ClusterIp,

[root@kmaster k8s-deploy]# kubectl apply -f my-websocket-svc.yaml

创建 ConfigMap

在 ingress-nginx-controller 所在的 namespace 下创建 ConfigMap(如果已经有 ConfigMap 了, 则可在已有 ConfigMap 的 data 部分添加下面配置中的 data 条目)

{% codeblock tcp-service-configmap.yaml lang:yaml %} apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: ingress-nginx data: 8828: "develop/my-websocket-svc:8828" {% endcodeblock %}

data 部分的格式为: ::[PROXY]:[PROXY], [PROXY]:[PROXY] 部分为可选。上述配置表示将宿主机的 8828 端口 映射到 develop namespace 下 my-websocket-svc 服务的 8828 端口上。

创建 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

在 .spec.template.spec.containers[].args[] 部分添加 --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services (或针对 UDP, --udp-services-configmap=$(POD_NAMESPACE)/udp-services), 如下图所示

在.spec.template.spec.containers[].ports[] 部分添加 port 映射,如图

经验证,不加该部分 port 映射配置也没问题

保存,应用配置更新,nginx-ingress-controller 将会自动重启 Pod,使配置生效。

验证

在 nginx-ingress-controller Pod 所在节点上执行如下命令查看是否监听了 TCP 端口,

如上,8828 端口已被 nginx-ingress 监听。

对于 Websocket 应用, 可使用 wscat 进行调试

C:\Users\Administrator>wscat -c ws://域名:8828Connected (press CTRL+C to quit)>

wscat 安装: npm install -g wscat

其它

注意 ConfigMap 的 namesapce 与 nginx-ingress-controller 一致,否则将 --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services 中的 $(POD_NAMESPACE) 改为 ConfigMap 具体的 namesapce如果将 nginx-ingress-controller 绑定了节点,则重启可能导致失败(因为端口分配冲突),可先删除(kubectl delete deploy ingress-nginx-controller -n ingress-nginx),再新建(kubectl apply -f nginx-ingress.yaml),该操作会影响服务可用性,生产环境需慎重如果配置后未生效,可通过查看 nginx-ingress-controller Pod 的日志定位原因 kubectl logs ingress-nginx-controller-58fdbbc68d-wqtlr -n ingress-nginx

参考文档:

https://ibm.com/support/knowledgecenter/en/SSSHTQ/omnibus/helms/all_helms/wip/reference/hlm_expose_probe.htmlhttps://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/exposing-tcp-udp-services.md

作者:雨歌

点个在看,支持作者

上一篇:中培专家带你快速精通Java高级开发实战技能
下一篇:HTML5开发火热,选择中培是您最明智的选择
相关文章

 发表评论

暂时没有评论,来抢沙发吧~