comhaqs 2019-07-01
我们都知道访问k8s 集群的服务需要ingress 接入。
据我所知,ingress 接入的方案有4种
1.云厂商提供LoadBalance, 比如aliyun SLB. 2.官方的实现 ingress controller 3.第三方实现方案 4.自建, 比如使用envoy
这里重点记录一下,如何自建一个ingress 的思路。
在讲如何自建一个k8s ingress 之前,这里分别记录一下ingress 的实现原理。
先说官方的实现。 https://github.com/kubernetes...
官方的ingress 接入实现使用ingress controller + nginx 实现的。
如上图所示
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 组成。
这里说一下为什么会有自建的需要
首先,我们系统中使用grpc, grpc 使用h2为载体,进行多路复用。
目前对grpc 代理做的比较好的是envoy.
有两种方式对grpc 进行代理
1). 4层代理,简单粗暴。
2). 7层代理。 做到可以更细维度的路由负载。
在说nginx proxy , nginx 是可以支持4层代理,也可以支持HTTP2 的7层代理,但是nginx 对grpc 支持不好。
因为 nginx 是不能做http2 的透明代理的。
nginx仅支持HTTP/ 2用于下游连接。
nginx 做7层代理,下游是h2 代理,到上游是http1.x . 并不是一个透明代理。
实际上,支持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 是支持xDS 动态下发routeconfig.
有xDS 监控 k8s api-server , 下发routeconfig 的路由信息。
参考文章
http://jm.taobao.org/2018/07/...,
https://segmentfault.com/a/11...