介绍
Ingress类似一个7层HTTP服务器,通过配置域名、location路径等将访问到ingress的请求反向代理到service,再由service路由到pod。
Ingress需要对应的Controller去实现,实现Ingress Controller的方案和开源项目有很多,最常见的就是Nginx Ingress Controller。除此之外还有Kong、APISIX、HAProxy等。
下表是各类Ingress Controller的对比:
对比项 | APISIX Ingress | Nginx Ingress | Kong Ingress | Traefix | HAProxy | Istio Ingress |
---|---|---|---|---|---|---|
协议 | http/https,http2,grpc,tcp/udp,tcp+tls,Dubbo | http/https,http2,grpc,tcp/udp | http/https,http2,grpc | http/https,http2,grpc,tcp,tcp+tls | http/https,http2,grpc,tcp,tcp+tls | http/https,http2,grpc,tcp,tcp+tls,mongo,mysql,redis |
基础平台 | Openresty/tengine | Nginx | openresty | Traefik | Haproxy | Envoy |
路由匹配 | path,method,host,header,nginx变量,args变量,自定义函数 | host,path | path,method,host,header | path,method,host,header,query,path prefix | host,path | path,method,host,header |
命名空间支持 | - | - | 指定命名空间 | 公用或指定命名空间 | 公用或指定命名空间 | 公用或指定命名空间 |
部署策略 | ab部署、灰度发布、金丝雀发布 | - | 金丝雀部署、蓝绿部署 | 金丝雀部署、蓝绿部署、灰度发布 | 蓝绿部署、灰度发布 | 金丝雀部署、蓝绿部署、灰度发布 |
upstream探测 | 重试、超时、心跳、熔断 | 重试、超时、心跳 | 心跳、熔断 | 重试、超时、心跳、熔断 | 探测url、ip、port | 重试、超时、心跳、熔断 |
负载均衡算法 | 一致性hash、WRR | RR、会话保持、最小连接、最短时间、一致性hash | WRR、会话保持 | WRR、动态RR、会话保持 | RR、static-RR、最小连接、源IP、url、header、会话保持 | RR、会话保持、一致性hash、maglev负载均衡 |
配置说明
ingress.spec字段说明
字段 | 类型 | 说明 |
---|---|---|
defaultBackend | <Object> | 当请求不匹配任何rules时,使用的默认流量处理后端。如果没有rules,则必须指定defaultBackend。如果没有设置defaultBackend,那么对不匹配任何规则的请求的处理将取决于Ingress Controller |
ingressClassName | <string> | 指定ingressClass资源的名字。用于替代退役的annotation ‘kubernetes.io/ingress.class’。当同时设置时并出现冲突时,annotation优先级高于ingressClassName,并发出警告。 xxClassName广泛应用于k8s的各类资源,表示指定对该类资源的一个实现,通常都需要一个安装一个Controller |
rules | <[]Object> | 用于配置Ingress Controller的主机规则列表。如果未指定或者没有匹配的规则,所有流量都被发送到defaultBackend |
tls | <[]Object> | TLS配置。Ingress目前只支持一个TLS端口443.如果列表中的多个成员指定了不同的主机,那么根据SNI TLS扩展指定的主机名,它们将在同一个端口上多路复用,如果实现Ingress的控制器支持SNI。 备注:SNI(Server Name Indication) 是TLS的扩展,用来解决一个服务器拥有多个域名的情况 |
ingress.spec.rules说明
字段 | 类型 | 说明 |
---|---|---|
host | <string> | 访问主机的FQDN。1.不允许使用IP地址。2.不允许使用":“指定端口,端口隐式的表示为80-http、443-https。3.可以精准使用主机名如foo.bar.com,也可以”"作为前缀如.foo.com,但不能独立使用"*"作为主机名 |
http | <Object> | 指向后端的http选择器列表 paths: <[]Object> - required - 将请求映射到后端的路径集合 |