阿里云k8s-ingress创建TCP端口

问题

在Kuberetes应用中,一般都是通过Ingress来暴露HTTP/HTTPS的服务。但是在实际应用中,还是有不少应用是TCP长连接的,这个是否也是可以通过Ingress来暴露呢?大家知道Kubernetes社区默认带了一个Nginx的Ingress的,而它本身又是支持TCP做反向代理的。所以也就能支持TCP方式的Ingress的。

具体可以参考:
https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/

原理

Ingress Controller在启动时会去watch两个configmap(一个tcp,一个 udp),里面记录了后面需要反向代理的TCP的服务以及暴露的端口。如果里面的key-value发生变换,Ingress controller会去更改Nginx的配置,增加对应的TCP的listen的server以及对应的后端的upstream。

实践

配置Nginx的Ingress的deployment/daemonSet

  • 增加Ingress controller需要watch的configmap
    c7c4c069117a7acd1d2cb2904f808a03
  • 创建对应的configmap,暂时不需要配置服务。(注意,阿里云的Kubernetes集群,已经默认创建好了对应的configmap: tcp-services, udp-services,无需再创建)

TCP configmap

1
2
3
4
5
6

apiVersion: v1
kind: ConfigMap
metadata:
name: tcp-services
namespace: kube-system

UDP configmap

1
2
3
4
5
6

apiVersion: v1
kind: ConfigMap
metadata:
name: udp-services
namespace: kube-system

创建一个TCP服务

为了简单,可以直接用一个Nginx来模拟就可。如果创建这个deployment, service这个就不啰嗦了。

  • 给TCP的服务配置”Ingress” TCP服务不像HTTP,不能使用Kubernetes的Ingress对象来配置,而是使用修改对应的Configmap来增加一个”Ingress”

kubectl edit configmap/tcp-services -n kube-system

  • 然后增加data部分:

格式为:

: <namespace/service name>::[PROXY]:[PROXY]

b87adfa0ede4f695f0338180c0244003

例子中将default/nginx这个服务暴露到5555端口

修改Ingress Controller的Service

因为TCP部分是需要通过端口来区分服务的,所以每个服务都需要增加一个独立端口,所以需要给Ingress Controller增加新的端口来映射后端的TCP服务

5776e07f67a442b5eacf0766bebc88d8

注意:在阿里云的Kubernetes服务创建的集群,可以不用指定nodeport,对应的cloud provider会自动到对应的SLB上创建端口映射如:

ea2190211413eec64b0677b3e89c421e

这样就完成了一个TCP的“Ingress”的创建了。

访问TCP服务

直接访问对应的SLB的5555端口就可以。如果没有SLB可以直接访问对应的node节点的nodeport也可以。

总结

给TCP创建“Ingress”总觉得有些workaround 的味道,还是期望后续社区能提供通过”Ingress”对象的方式来创建TCP的Ingress。