天天看点

Nginx-ingress 控制器到底怎样实现的,这篇文章教你看明白了

Nginx-ingress 控制器到底怎样实现的,这篇文章教你看明白了

一般 nginx 做主机反向代理(网关)有以下配置

其中 192.168.1.10:5001,192.168.1.10:5001 我们把他们称为 endpoint,就是所谓的具体的服务,比如 order 订单服务。

nginx-ingress也是一种代理,是一个pod,外部的数据统一经过(必经)这个pod,然后通过该pod内部的nginx方向代理到各各服务(endpoint)。nginx-ingress是ingress控制器插件的一种,这些插件有很多,比如istio-ingressgateway。

nginx-ingress pod有两个功能,controller 和 nginx:

controller:和kubernetes api通讯实时更新nginx配置(就是ingress yaml资源了) nginx:正常的反向代理

与主机nginx的区别是,该pod nginx-ingress是运行在pod里。主机在定义反向代理配置文件时,需要监听一个对外开放的端口,比如上边的80端口。那么pod中的nginx端口是如何配置的呢?

我们在github上找到了nginx-ingress的deployment.yaml

其中一段

我们看到

默认对外监听了两个端口80和443,也就是说,有这两个端口对外就可以web服务了。

ingress 资源通过yaml进行管理的,比如以下:

以上我们定义了一个单一规则的ingress,该pod(nginx-ingress)接收到外部所有的请求,将被发送到内部order服务的80端口上。接下来我们看pod(nginx-ingress)如何把ingress资源转化为该pod中的nginx反向代理配置文件

当然ingress如果包含https,那么会转化nginx对应的443端口及证书的配置文件内容,这里就不写了。

那么,单一个规则的ingress资源代理多个服务(比如order服务,product服务)或者多个ingress资源文件如何转化为nginx配置? 猜测,其实就是转化成了多个。

当然,被转化的nginx配置文件要比这些复杂的多,据说还是用lua脚本写的,灵活如openresty。

一般来讲,pod直接对外提供服务就只有两种方式:

create一个service,该service暴漏nodeport

forward 映射

我们一般采用第一种。

nginx-ingress也是一个pod,所以,为了能使外部通过该pod代理访问,还需要nginx-ingress对外提供一个nodeport的service。这个service这里也不再写了。

Nginx-ingress 控制器到底怎样实现的,这篇文章教你看明白了

我们可以看到,因为 nginx-ingress 这个pod做了所有service的代理,在高并发情况下将承受巨大压力,我们可以增加多个pod实例。

作者:dakesolo

链接:https://juejin.cn/post/6844903957479817230

k8s

继续阅读