背景
下面我将以这个思维导图来总结一下Ingress。
简介
service是工作在L4的,如果有更高级的需求,比如根据用户或者不同的URI来转发到不同的路径,L4的service就无法实现。这时就可以通过L7的ingress来实现。
与L4 service的对比
L4 service
- kube-proxy 基于 iptables rules 实现了分布式负载均衡。
- kube-proxy 是一种 mesh,无论通过 podip,nodeport 还是 LB VIP 都经由 kube-proxy跳转至 Pod。
- 每个应用独占 ELB(EIP),浪费资源。
- 为每个服务动态创建 DNS记录,频繁的 DNS更新。
- 支持 TCP 和 UDP,如果需要启动 HTTPS 服务,自己管理证书。
L7 ingress
- URL/http header rewrite。
- L7 path forwarding。
- 多个应用共享 ELB(EIP),节省资源。
- 多个应用共享一个 Domain,可采用静态 DNS 配置。
- TLS termination 发生在 Ingress层,可集中管理证书。
- 增加了网络跳数,网络更复杂。
工作原理
ingress
- Ingress 是一层代理。
- 负责根据 hostname 和 path 将流量转发到不同的服务上,使得一个负载均衡器用于多个后台应用。
- Kubernetes Ingress Spec 是转发规则的集合。
ingress controller
- 监听ingress对象,读取ingress配置,把配置转换成代理软件如nginx可以读取的配置,然后重启或者热加载来使配置生效。
- 确保实际状态(Actual)与期望状态(Desired)一致。
- 负载均衡配置。
- 边缘路由配置。
- DNS配置。
实例
查看ingress pod
ingress-nginx-ingress-controller-default-backend:如果外界访问的域名不存在的话,则默认转发到default-http-backend这个Service,其会直接返回404:
查看ingress配置文件
查看ingressClass
查看ingress服务
访问服务
ingress是nodePort类型,安全组放开80和443端口,域名备案后,即可直接通过域名访问。
curl -H "Host: wghdr.top" https://10.96.194.221 -k
访问路径
- 外部服务首先通过dns解析域名到物理机的ip。
- 访问物理机的80端口,即ingress的nodePort端口。
- 通过kube-proxy转发到ingress-nginx-ingress-controller pod的80端口。
- ingress-controller中的nginx服务解析nginx配置文件,根据request header匹配用户请求,决定把请求转发到哪个backend。