跳到主要内容

【5】IngressController的使用

参考 k8s-tutorial-cn

Ingress概念

Ingress是Kubernetes中的一个资源对象,用来管理集群外部访问集群内部服务的方式(处理从公网到集群的流量),从网络分层上看,Ingress是一个七层网络代理。

Ingress在k8s中是一个逻辑概念,它需要一个Ingress控制器来实际执行这些规则。

为什么需要Ingress

NodePort、LoadBalancer和ExternalIP实现的对外暴露服务都有一个比较严重的问题,那就是需要占用节点端口。也就是说,占用节点端口的数量会随着服务数量的增加而增加,这就产生了很大的端口管理成本。 除此之外,这些方式也不支持域名以及SSL配置(除了LoadBalancer),还需要额外配置其他具有丰富功能的反向代理组件,如Nginx、Kong等。

Ingress可以为多个域名配置不同的路由规则,在仅占用单个节点端口的同时实现灵活的路由配置功能,类似Nginx等反向代理服务器。

Ingress提供以下功能:

  • 路由规则:Ingress 允许你定义路由规则,使请求根据主机名和路径匹配路由到不同的后端服务。这使得可以在同一 IP 地址和端口上公开多个服务。
  • Rewrite 规则:Ingress 支持 URL 重写,允许你在路由过程中修改请求的 URL 路径;
  • TLS/SSL 支持:你可以为 Ingress 配置 TLS 证书,以加密传输到后端服务的流量;
  • 负载均衡:Ingress 可以与云提供商的负载均衡器集成,以提供外部负载均衡和高可用性;
  • 虚拟主机:你可以配置多个主机名(虚拟主机)来公开不同的服务。这意味着你可以在同一 IP 地址上托管多个域名;
  • 自定义错误页面:你可以定义自定义错误页面,以提供用户友好的错误信息;
  • 插件和控制器:社区提供了多个 Ingress 控制器,如 Nginx Ingress ControllerTraefik,它们为 Ingress 提供了更多功能和灵活性。

Ingress控制器

官方提供的Ingress控制器列表

Ingress控制器是Kubernetes集群中的一个独立组件或服务,以Pod形式存在。它实际处理 Ingress 规则,根据这些规则配置集群中的代理服务器(如 Nginx、Traefik 等)来处理流量路由和负载均衡。Ingress控制器是实际承载流量转发的组件。每次更新Ingress规则后,都会动态加载到控制器中。

使用Ingress访问服务的流量链路如下:

  • 用户流量通过公网DNS流入Ingress Controller Pod
  • Ingress Controller Pod根据配置的规则找到并转发流量给对应后端服务所在的Node
    • (下面描述的是在集群内通过ServiceName访问服务的流量转发流程)
    • 首先会通过集群内的CoreDNS服务查询ServiceName对应的ClusterIP
    • 然后通过节点所在的kube-proxy所配置好的iptables规则将流量转发给Pod所在的Node
      • 在iptables规则中可以找到ClusterIP的下一跳,即Pod所在的Node IP
      • 若有多个Pod后端,则iptables中也会存在多条能匹配目标ClusterIP的规则,此时会按规则概率进行转发(默认都具有相同概率,也就是均衡)
  • Node接收到流量后再根据(kube-proxy所配置好的)本地iptables将流量转发给本地的Pod

使用ingress-nginx

容易混淆的名称:
1.【kubenetes/ingress-nginx】是基于开源 nginx 版本,由 k8s 官方维护,地址为ingress-nginx/controller
2.【nginxinc/kubernetes-ingress】由 F5 NGINX 维护,存在开源版和商业版本,可以付费切换,对应的是 nginx/nginx-ingressnginx-plus-ingress

使用Traefik