1.什么是Ingress
Ingress 也是为了解决在集群之外,访问集群内部Service服务的问题。
实际上,将service的type设置为nodePort或LoadBalancer,
也能实现将集群内部的服务暴露给外部访问。
那Ingress岂不是多余的?
先回顾下,LoadBalancer类型的Service访问流程,如下:
/————————————————————————————————————————————————
| 集群内部 .-------> Pod |
| / |
集群外部(client) ---->LoadBalancer-----+--> node_ip:nodePort ----> Service |
| \ |
| .-------> Pod |
| |
\————————————————————————————————————————————————
LoadBalancer 类型的 Service 一般应用于云平台环境中,这个LoadBalancer是由云厂商提供的,
位于k8s集群外部,当用户在云平台上创建一个该类型的Service时,
同时会为该 Service 创建一个对应的负载均衡器。可以发现,每个 Service 都要有一个负载均衡器,
这种做法实际上是成本比较高的。
Ingress除了能将集群内部的服务暴露给外界访问,它也是一个负载均衡器,
专门是为集群内部的Service提供负载均衡服务。
Ingress 与 LoadBalancer 类型的 Service 有点类似,但区别在于,
Ingress是一个k8s集群内部的全局的负载均衡器,作为k8s集群中的一个对象资源而存在,
而LoadBalancer类型则是一个集群外部的负载均衡服务器。
2.Ingress 工作原理
Ingress,是K8s的一个资源对象,定义了一系列路由转发规则(或反向代理规则)。
它规定了外部进来的HTTP/HTTPS请求,应该被转发到哪个Service上。
具体说,Ingress就是一段nginx服务的反向代理配置,它能根据请求中不同的
Host和URL路径,将请求转发到不同的Service所对应的后端Pod上。
Ingress Controller相当于是一个反向代理程序,负责解析Ingress的反向代理规则,
并实时感知Ingress转发规则的变化。一旦Ingress规则有变化,
Ingress Controller会及时更新自己相应的转发规则,并根据这些规则,
将接收到的请求转发到对应的Service。
Ingress Controller 是通过API Server获取Ingress资源的变化,
并动态地生成Load Balancer(如Nginx程序)所需的配置文件(如nginx.conf),
然后重新加载Load Balancer(如执行nginx -s load重新加载Nginx)来生成新的路由转发规则。
Ingress与手动部署反向代理服务器的思路是一样的。如果反向代理服务器使用的是Nginx程序,Ingress Controller 会将 Ingress 规则变化生成一段Nginx的配置,然后将这个配置写到Ingress Controller管理下的Nginx Pod中,然后reload。
部署 Ingress :
Ingress组件需要提前部署到k8s集群中,它包括 Ingress Service 与
Ingress Controller,以及Ingress Controller管理下的两个Nginx Pod。
反向代理服务器有Nginx、Apache、traefik等,这里选择用Nginx。
Ingress 使用:
Ingress能将来自于不同域名的请求转发到不同的Service上,
也可以将同一个域名下的请求,根据不同URI接口转发到不同的Service上。
3.ingress相关yaml文件解析
spec:
backend: 全局默认后端。若不匹配任何规则的请求,都会代理到默认后端
serviceName: service的名称。要将请求代理到哪个Service上
servicePort: service的端口
rules: 定义入站流量的转发规则
host: 第一条规则,检查入站流量是否匹配此处定义的域名
http:
paths:
path: 第二条规则,检查入站流量的URI路径,是否匹配此处定义的path(省略即为"/")
backend: 自定义后端。所有入站流量都会先匹配host与path规则,当两个都匹配时,才会将流量代理到下面定义的service上,否则会发送到默认backend
serviceName:
servicePort:
tls: 配置HTTPS