Service虽说是为集群内部pod访问一组微服务提供固定接入点,其实NodePort、LoadBalancer方式可以通过在Node上配置端口映射实现外部集群访问内部service。这种方式存在以下问题:
● 仅支持L4调度,不支持域名和Loctation方式分发流量
● 对于SSL会话卸载,需要在pod内部完成,比较复杂
● 当业务数量增加时,容易出现端口冲突
Ingress 是 Kubernetes 的一种 API 对象,是实现HTTP/HTTPS、基于路径和域名进行流量转发的一组规则,实现了将集群外部七层流量转发到集群内部。IngressController是将Ingress规则实现的一种负载均衡器Pod,如Nginx、Traefik、HAProxy等。
IngressController有两种部署方式:一种是采用DaemonSet方式部署,一种是Deployment方式部署。为了降低复杂度,一般都采用DaemonSet方式部署。如下图所示:
● ingress-controller 采用DaemonSet方式部署在各个node节点之上
● 集群外部部署一个七层负载均衡,如Nginx。Nginx负责做流量转发和SSL会话卸载
● ingress-controller根据ingress规则将流量调度到指定的service上
● 各service再将流量转发到各个pod上