首先你具体的服务是容器,容器在 pod 里,pod 的 ip 是会变的,所以引入 service ,service 的 ip 是集群内固定的 ip ,然后你的每个 pod 是一个 endpoint ,service 管理多个 endpoint ,根据一定规则把每次请求分发到不同的 endpoint ,也就是 pod ,然后 service 可以通过 nodePort 或者 LoadBalance 把集群内服务暴露给外部访问,但这是基于 ip+端口号的,而 ingress 就是在 service 的基础上,提供根据域名、路由、正则等你所有能想得到的基于域名解析的路由分配请求的方式,比如
a.b.com 分配到 service1 ,
b.b.com 分配给 service2 ,*.b.com 分配给 service3 。
简单理解的话,集群外部流量是按这个顺序来的:ingress->service->pod->container
然后 ingress 有各种不同的实现,Nginx 只是其中一种,更强大的还有 ingress-traefik 、ingress-apisix ,说白了 ingress 就是个 interface ,Nginx apisix traefik 只是实现了这个 interface 的具体功能而已,基于这个理解,你可以认为,ingress 实际上就是一个集群专用的反向代理。
而 ingress 可以使用 deployment 、daemonset 等方式进行部署,部署后本身也是 pod ,那么它实际上也符合上述的条件,ingress 也有 service ,一般来说会使用 LoadBalance 模式的 service 暴露出一个 ip ,这样的话你应该能理解了,ingress 有多个 pod ,所以本身是高可用,然后通过 LoadBalance 的 service 做了一个负载均衡+暴露服务,接下来你只需要到 dns 提供商那里把你的域名解析到这个 ip 上就可以了,用户通过访问域名,就会把流量打到你的 ingress 的 pod 上,然后 ingress 根据域名规则,把请求路由到具体服务的 service 上,service 本身又有负载均衡,会路由到不同的 pod 上,基于此实现整个集群的 ha