在KubernetesIngress中⽀持WebsocketSocket服务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),
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: ConfigMapwebsocket和socket
metadata:
name: tcp-services
namespace: ingress-nginx
data:
8828: "develop/my-websocket-svc:8828"
data 部分的格式为:<namespace/service name>:<service port>:[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
在.ainers[].args[]部分添加--tcp-services-configmap=$(POD_NAMESPACE)/tcp-
services(或针对 UDP,--udp-services-configmap=$(POD_NAMESPACE)/udp-services),如下图所⽰
在.ainers[].ports[]部分添加 port 映射,如图
经验证,不加该部分 port 映射配置也没问题
保存,应⽤配置更新,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)
>
wscat 安装:npm install -g wscat
其它
1. 注意 ConfigMap 的 namesapce 与 nginx-ingress-controller ⼀致,否则将--tcp-services-configmap=$(POD_NAMESPACE)/tcp-services中的
$(POD_NAMESPACE)改为 ConfigMap 具体的 namesapce
2. 如果将 nginx-ingress-controller 绑定了节点,则重启可能导致失败(因为端⼝分配冲突),可先删除(kubectl delete deploy ingress-nginx-
controller -n ingress-nginx),再新建(kubectl apply -f nginx-ingress.yaml),该操作会影响服务可⽤性,⽣产环境需慎重
3. 如果配置后未⽣效,可通过查看 nginx-ingress-controller Pod 的⽇志定位原因kubectl logs ingress-nginx-controller-58fdbbc68d-wqtlr -n ingress-
nginx
参考⽂档:
1.
2.
[转载请注明出处]
作者:⾬歌
欢迎关注作者:半路⾬歌,查看更多技术⼲货⽂章

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。