ingress介绍
K8s对外暴露service的三种方式ClusterIP、NodePort与LoadBalance,这几种方式都是在service的维度提供的,service的作用体现在两个方面,对集群内部,它不断跟踪pod的变化,更新endpoint中对应pod的对象,提供了对不断变化ip的pod的服务发现机制,对集群外部,它类似负载均衡器,可以在集群内外部对pod进行访问。但是,单独用service暴露服务的方式,在实际生产环境中不太合适:
ClusterIP的方式只能在集群内部访问。
NodePort方式的话,测试环境使用还行,当有几十上百的服务在集群中运行时,NodePort的端口管理是灾难。
LoadBalance方式受限于云平台,且通常在云平台部署ELB还需要额外的费用。
k8s还提供了一种集群维度暴露服务的方式,也就是ingress。ingress可以简单理解为service的service,他通过独立的ingress对象来制定请求转发的规则,把请求路由到一个或多个service中。这样就把服务与请求规则解耦了,可以从业务维度统一考虑业务的暴露,而不用为每个service单独考虑。
Ingress 不仅可以让外部客户端访问服务,还可以自定义服务的访问策略。在前面介绍的 LoadBalancer Service 中,我们知道每一个服务都需要定义一个负载均衡器和唯一的共有 IP 地址,如果一个应用可以提供多种服务,那么显然这种方式是不够友好的。而 Ingress 只需要一个公网 IP 地址就可以为多个服务提供自定义的访问。因此,Ingress 是一种非常灵活、得到越来越多厂商支持的集群服务暴露方式,在实际的生产环境中使用得最多,而其他的服务暴露方式更多地适用于服务调试、特殊应用部署等方面。
ingress由两部分组成:ingress controller和ingress服务。 其中ingress controller目前主要有两种:基于Nginx服务的ingress controller和基于traefik的ingress controller。 而其中traefik的ingress controller,目前支持http和HTTPS协议。由于对nginx比较熟悉,而且需要使用 TCP负载,所以在此我们选择的是基于nginx服务的ingress controller 。 在Kubernetes集群中,我们知道service和pod的ip仅在集群内部访问。如果外部应用要访问集群内的服务,集群外部的请求需要通过负载均衡转发到service在Node上暴露的NodePort上,然后再由kubeproxy组件将其转发给相关的pod。 而Ingress就是为进入集群的请求提供路由规则的集合,通俗点就是提供外部访问集群的入口,将外部 的HTTP或者HTTPS请求转发到集群内部service上。 Ingress-nginx组成 Ingress-nginx一般由三个组件组成: 反向代理负载均衡器:通常以service的port方式运行,接收并按照ingress定义的规则进行转发, 常用的有nginx,Haproxy,Traefik等,本次实验中使用的就是nginx。 Ingress Controller:监听APIServer,根据用户编写的ingress规则(编写ingress的yaml文件), 动态地去更改nginx服务的配置文件,并且reload重载使其生效,此过程是自动化的(通过lua脚本来实现)。 Ingress:将nginx的配置抽象成一个Ingress对象,当用户每添加一个新的服务,只需要编写一个 新的ingress的yaml文件即可。 Ingress-nginx的工作原理 ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化。然后读取 它,按照自定义的规则,规则就是写明了那个域名对应哪个service,生成一段nginx配置。 再写到nginx-ingress-controller的Pod里,这个Ingress controller的pod里运行着一个Nginx服 务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中。然后reload一下使配置生效,以此达到分配和动态更新问题。