一,ingress简介
1、Kubernetes 暴露服务的方式:
NodePort:后期维护困难,不支持虚拟路径
LoadBlancer:需要云厂商支持,有局限性
ClusterIP:只能在集群内部访问
Ingress:灵活,无依赖
前三种方式都是在service的维度提供的,service的作用体现在两个方面
(1)对集群内部它不断跟踪pod变化,更新endpoint中对应的pod的对象,提供IP不断变化的pod的服务发现机制;
(2)对集群外部,它类似负载均衡器,可以在集群内外对pod进行访问。但是单独使用service暴露服务的方式,在实际生产环境中不太适应。
四层负载均衡表示负载均衡器用ip+port接收请求,再直接转发到后端对应的服务上,工作在传输层( transport layer );
七层负载均衡表示负载均衡器根据虚拟的url或主机名来接收请求,经过处理后再转向相应的后端服务上,工作在应用层( application layer )。
>>而ingress相当于service的service,可以将外部请求通过不同规则的筛选后转发到不同的service,是可以实现七层负载均衡的服务
二,ingress的组成
ingress相当于一个7层的负载均衡器,是k8s对反向代理的一个抽象。大概的工作原理也确实类似于Nginx,可以理解成在 Ingress 里建立一个个映射规则 , ingress Controller 通过监听 Ingress这个api对象里的配置规则并转化成 Nginx 的配置(kubernetes声明式API和控制循环) , 然后对外部提供服务。ingress包括:ingress controller和ingress resources
ingress controller:核心是一个deployment,实现方式有很多,比如nginx, Contour, Haproxy, trafik, Istio,需要编写的yaml有:Deployment, Service, ConfigMap, ServiceAccount(Auth),其中service的类型可以是NodePort或者LoadBalancer。
ingress resources:这个就是一个类型为Ingress的k8s api对象了,这部分则是面向开发人员。
配置 Ingress resources,即可实现多个service对外暴露服务:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: cafe-ingress
spec:
rules:
# 配置七层域名
- host: foo.bar.com
http:
paths:
# 配置Context Path
- path: /tea
backend:
serviceName: tea-svc
servicePort: 80
# 配置Context Path
- path: /coffee
backend:
serviceName: coffee-svc
servicePort: 80
接着在hosts文件中添加一条解析规则:${ingress_IP} foo.bar.com,这时通过在浏览器中访问:foo.bar.com/coffee或者foo.bar.com/tea即可访问对应的后端service了。
使用curl时的操作:curl -H "Host: foo.bar.com" http://${ingress_IP}/coffee



