乐趣区

关于docker:在-Kubernetes-Ingress-中支持-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: ConfigMap
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

.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:// 域名: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. https://www.ibm.com/support/k…
  2. https://github.com/kubernetes…

[转载请注明出处]
作者:雨歌
欢送关注作者公众号:半路雨歌,查看更多技术干货文章

退出移动版