什么是路由(Ingress)

为什么需要Ingress

Service基于TCP和UDP协议进行访问转发,为集群提供了四层负载均衡的能力。但是在实际场景中,Service无法满足应用层中存在着大量的HTTP/HTTPS访问需求。因此,Kubernetes集群提供了另一种基于HTTP协议的访问方式——Ingress。

Ingress相关定义

  1. Ingress资源:一组基于域名或URL把请求转发到指定Service实例的访问规则,是Kubernetes的一种资源对象,通过接口服务实现增、删、改、查的操作。
  2. Ingress Controller:请求转发的执行器,用以实时监控资源对象Ingress、Service、End-point、Secret(主要是TLS证书和Key)、Node、ConfigMap的变化,解析Ingress定义的规则并负责将请求转发到相应的后端Service。

Ingress Controller在不同厂商之间的实现方式不同,根据负载均衡器种类的不同,可以将其分成ELB型和Nginx型。CCE支持上述两种Ingress Controller类型,其中ELB Ingress Controller基于弹性负载均衡服务(ELB)实现流量转发;而Nginx Ingress Controller使用Kubernetes社区维护的模板与镜像,通过Nginx组件完成流量转发。

Ingress Controller工作原理

ELB Ingress Controller工作原理

集群内访问表示工作负载暴露给同一集群内其他工作负载访问的方式,通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部CCE自研的ELB Ingress Controller基于弹性负载均衡服务ELB实现公网和内网(同一VPC内)的七层网络访问,通过不同的URL将访问流量分发到对应的服务。

ELB Ingress Controller部署于Master节点上,与集群所在VPC下的弹性负载均衡器绑定,支持在同一个ELB实例(同一IP)下进行不同域名、端口和转发策略的设置。ELB Ingress Controller的工作原理如图,实现步骤如下:

1.用户创建Ingress资源,在Ingress中配置流量访问规则,包括负载均衡器、URL、SSL以及访问的后端Service端口等。

2.Ingress Controller感知到Ingress资源发生变化时,就会根据其中定义的流量访问规则,在ELB侧重新配置监听器以及后端服务器路由。

3.当用户进行访问时,流量根据ELB中配置的转发策略转发到对应的后端Service端口,然后再经过Service二次转发访问到关联的各个工作负载。


Nginx Ingress Controller工作原理

Nginx型的Ingress使用弹性负载均衡(ELB)作为流量入口,并在集群中部署nginx-ingress插件来对流量进行负载均衡及访问控制。

说明:nginx-ingress插件直接使用社区模板与镜像,CCE不提供额外维护,不建议用于商用场景。开源社区地址:https://github.com/kubernetes/ingress-nginx

Nginx型的Ingress Controller通过pod部署在工作节点上,因此引入了相应的运维成本和Nginx组件运行成本,其工作原理如图,实现步骤如下:

1.当用户更新Ingress资源后,Ingress Controller就会将其中定义的转发规则写入到Nginx的配置文件(nginx.conf)中。

2.内置的Nginx组件进行reload,加载更新后的配置文件,完成Nginx转发规则的修改和更新。

3.在流量访问集群时,首先被已创建的负载均衡实例转发到集群内部的Nginx组件,然后Nginx组件再根据转发规则将其转发至对应的各个工作负载。


常见问题

常见问题

更多常见问题

更多常见问题

  • 集群内部无法使用ELB地址访问负载

    添加Ingress失败或无法正常访问的通用排查思路如下,帮助您由浅入深地排查Ingress访问异常问题。

    1.检查异常是否由Ingress引起。

    首先需要确认问题是否由Ingress导致的,因此需要确保外部域名解析正常、安全组规则正确,且Ingress对应的Service和工作负载工作正常。

    2.检查Ingress状态是否正常。

    在Service和工作负载都正常的情况下,需要保证Ingress依赖的ELB状态正常。如果是Nginx型的Ingress,还需要保证nginx-ingress插件的状态是正常的。

    3.检查Ingress配置是否正确。

    如果以上排查结果都正常,说明可能是Ingress的配置出现问题。

    1. 检查对接ELB参数是否填写正确。
    2. 检查Service参数是否填写正确。
    3. 检查转发配置的参数是否填写正确。

    4.检查证书问题。

    如果Ingress开启了HTTPS访问,还需要排除证书配置错误的问题。您可使用相同ELB创建一个HTTP协议的Ingress访问,如HTTP协议下访问正常,则说明HTTPS协议证书可能存在问题。

    5.如果以上排查均无效果,请进行抓包分析,或提交工单寻求帮助。


    更多详情请参考此文档


  • Ingress如何实现URL重写

    Nginx Ingress:

    您可以通过Rewrite方法实现URL重写,即使用以下注解可以实现不同路径的重写规则。

    nginx.ingress.kubernetes.io/rewrite-target

    更多详情请参考此文档

  • Ingress如何对接HTTPS协议的后端服务

    ELB Ingress:

    Ingress可以对接不同协议的后端服务,在默认情况下Ingress的后端代理通道是HTTP协议的,若需要建立HTTPS协议的通道,可在annotation字段中加入如下配置:

    kubernetes.io/elb.pool-protocol: https

    更多详情请参考此文档

    Nginx Ingress:

    对于Nginx Ingress,可在annotation字段中加入如下配置:

    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"

    更多详情请参考此文档

  • 为什么更换命名空间后无法创建ingress?

    在default命名空间下可以正常创建ingress,但在其他命名空间(如:ns)下创建时不能创建成功。

    这是因为创建弹性负载均衡ELB后,使用default命名空间创建80端口的http监听器,而在CCE中只允许在本命名空间下创建同一端口的其它ingress(实际转发策略可根据域名、service来区分);所以出现客户侧在其它命名空间无法创建相同端口的ingress的情况(会提示端口冲突)。