一、iptables/ipvs
前面我们说到kube-proxy是基于iptables/ipvs的分布式L4负载均衡技术,但是有很多的需求场景是这种网络层的dnat不能提供的能力。
基于L4的服务
- 每个应用独占ELB,浪费资源
- 每个服务都需要创建DNS配置
- 启动HTTPS,每个服务需要自己管理证书
二、ingress
ingress是基于L7应用层的负载均衡技术,在用户态应用层面提供了更多的功能支持。例如:
- L7 path forwarding,请求路径的转发
- http header rewrite
- TLS termination
基于L7的ingress:
- 多个应用共享ELB
- 多个应用共享Domain,可采用静态DNS配置
- TLS termination发生在ingress层,可集中管理证书。
也是需要通过service将外部流量转到集群内部,在指向ingress pod去做L7负载均衡,比如请求路径/a就转向a服务,/b就转向b服务。ingress根据hostname和path将流量转发到不同服务,使得一个负载均衡器用于多个后台应用
2.1 工作原理
ingress是一层代理,将流量转到不同的服务。类比传统反向代理软件nginx或者envoy,通常转发规则需要手动配置配置文件。而ingress是kubenetes的一个资源对象,是转发规则的抽象,只要定义好了ingress,那么ingress controller将会生成反向代理软件的转发配置文件。
三、发布ingress
首先需要在集群安装Ingress Controller,不同的代理软件提供了不同的Ingress Controller,以nginx为例。
1、下载Nginx Ingress Controller的部署文件:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml
2、安装Ingress Controller
kubectl apply -f deploy.yaml
查看到Ingress Controller部署成功了
并生成了接收外部流量的service
该service接收到外部请求后,将交由ingress-nginx-controller pod处理。
3、配置ingress转发规则
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: gatewayannotations:kubernetes.io/ingress.class: "nginx"
spec:rules:- host: org.sxm.comhttp:paths:- path: "/"pathType: Prefixbackend:service:name: httpserver-svcport:number: 80
ingress规则绑定了请求域名和路径。
ingress-nginx-controller pod接收请求后根据转发规则,将请求转发到各backend服务。
4、访问外部流量统一入口
将请求转发到了后端服务httpserver-svc。