如何自建一个k8s ingress 思路
如何自建一个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 实现的。
如上图所示
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用于下游连接。
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 代理
如下图:
envoy 是支持xDS 动态下发routeconfig.
有xDS 监控 k8s api-server , 下发routeconfig 的路由信息。
参考文章
http://jm.taobao.org/2018/07/...,
https://segmentfault.com/a/11...