如何自建一个k8s ingress 思路

ingress 接入方案

我们都知道访问k8s 集群的服务需要ingress 接入。

据我所知,ingress 接入的方案有4种

1.云厂商提供LoadBalance, 比如aliyun SLB.
2.官方的实现 ingress controller 
3.第三方实现方案
4.自建, 比如使用envoy 

这里重点记录一下,如何自建一个ingress 的思路。

ingress 接入方案的原理

在讲如何自建一个k8s ingress 之前,这里分别记录一下ingress 的实现原理。
先说官方的实现。 https://github.com/kubernetes...
官方的ingress 接入实现使用ingress controller + nginx 实现的。

clipboard.png

如上图所示

   ingress 接入分为配置控制和数据代理。
   ingress controller 是一个控制中心,监控的数据来源
   1.k8s 集群的api-server, 比如node 、service、 pod 变化
   2.ingress 实例的configMap
   
   ingress controller 发现监控的数据有变化,就把监控的数据转换成为nginx.conf 代理所需要配置。
   然后reload nginx. 从而实现数据流量接入路由。

   当然,如果ingress controller 这一套部署在k8s 集群内的话,肯定是要暴露端口的。

我接触到到的aliyun 的SLB 也类似。
SLB 控制中心是一个叫CMI的程序,监控k8s 对应的label, 数据代理是有LVS + nginx 组成。

自建ingress

这里说一下为什么会有自建的需要
首先,我们系统中使用grpc, grpc 使用h2为载体,进行多路复用。
目前对grpc 代理做的比较好的是envoy.
有两种方式对grpc 进行代理
1). 4层代理,简单粗暴。
2). 7层代理。 做到可以更细维度的路由负载。

在说nginx proxy , nginx 是可以支持4层代理,也可以支持HTTP2 的7层代理,但是nginx 对grpc 支持不好。
因为 nginx 是不能做http2 的透明代理的。

1.nginx 做7 层代理h2

nginx仅支持HTTP/ 2用于下游连接。

clipboard.png

nginx 做7层代理,下游是h2 代理,到上游是http1.x . 并不是一个透明代理。

2.nginx 做grpc 的4层代理。

实际上,支持4层代理的软件,都支持grpc 代理。因为h2 也是基于tcp 的。
就简单的当做一个tcp 来处理。
但是使用4层代理来做grpc 的代理有很大的缺点:
1).没有办法很好做到负载均衡。 因为h2 是7层协议,如果想在请求级别上做好负载均衡, 必须支持h2 7层协议。
2).没有办法收敛连接数。如果你的服务是连接数很多(比如一个grpc 的接入服务器), 那边4层代理透传连接数到上游服务, 这样一部4层代理本身的连接数翻倍,大量消耗连接数资源。

而 envoy 代理grpc 没有上面2个问题。
1).envoy 支持h2 的路由转发,并且配置负载均衡。
2).envoy 代理h2 到上游服务,连接数是收敛的。比如50w 连接数到经过envoy 代理到上游服务可能是20 个连接,连接数大大收敛。

envoy ingress 代理

envoy ingress 代理
如下图:
clipboard.png

envoy 是支持xDS 动态下发routeconfig.
有xDS 监控 k8s api-server , 下发routeconfig 的路由信息。

参考文章
http://jm.taobao.org/2018/07/...
https://segmentfault.com/a/11...


Allenchen
9 声望0 粉丝