Skip to content

1. Ingress文档

  • Kubernetes Ingress

https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/

https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/

https://kubernetes.github.io/ingress-nginx/

2. k8s和ingress对应版本关系

https://github.com/kubernetes/ingress-nginx/tree/controller-v1.6.4?spm=a2c6h.12873639.article-detail.7.715a3cb8JYXJdd&file=controller-v1.6.4

  • Supported Versions table

Supported versions for the ingress-nginx project mean that we have completed E2E tests, and they are passing for the versions listed. Ingress-Nginx versions may work on older versions, but the project does not make that guarantee.

入口(Ingress)目前已停止更新。新的功能正在集成至网关 API 中。

SupportedIngress-NGINX versionk8s supported versionAlpine VersionNginx VersionHelm Chart Version
🔄v1.11.31.30, 1.29, 1.28, 1.27, 1.263.20.31.25.54.11.3
🔄v1.11.21.30, 1.29, 1.28, 1.27, 1.263.20.01.25.54.11.2
🔄v1.11.11.30, 1.29, 1.28, 1.27, 1.263.20.01.25.54.11.1
🔄v1.11.01.30, 1.29, 1.28, 1.27, 1.263.20.01.25.54.11.0
🔄v1.10.41.30, 1.29, 1.28, 1.27, 1.263.20.01.25.54.10.4
🔄v1.10.31.30, 1.29, 1.28, 1.27, 1.263.20.01.25.54.10.3
🔄v1.10.21.30, 1.29, 1.28, 1.27, 1.263.20.01.25.54.10.2
🔄v1.10.11.29, 1.28, 1.27, 1.263.19.11.25.34.10.1*
🔄v1.10.01.29, 1.28, 1.27, 1.263.19.11.25.34.10.0*
🔄v1.9.61.29, 1.28, 1.27, 1.26, 1.253.19.01.21.64.9.1*
🔄v1.9.51.28, 1.27, 1.26, 1.253.18.41.21.64.9.0*
🔄v1.9.41.28, 1.27, 1.26, 1.253.18.41.21.64.8.3
🔄v1.9.31.28, 1.27, 1.26, 1.253.18.41.21.64.8.*
🔄v1.9.11.28, 1.27, 1.26, 1.253.18.41.21.64.8.*
🔄v1.9.01.28, 1.27, 1.26, 1.253.18.21.21.64.8.*
v1.8.41.27, 1.26, 1.25, 1.243.18.21.21.64.7.*
v1.7.11.27, 1.26, 1.25, 1.243.17.21.21.64.6.*
v1.6.41.26, 1.25, 1.24, 1.233.17.01.21.64.5.*
v1.5.11.25, 1.24, 1.233.16.21.21.64.4.*
v1.4.01.25, 1.24, 1.23, 1.223.16.21.19.10†4.3.0
v1.3.11.24, 1.23, 1.22, 1.21, 1.203.16.21.19.10†4.2.5

3. Ingress诞生背景

1、K8S集群内SVC不支持外部访问;

2、通过NodePort方式不易于后续管理;只支持4层负责均衡;

3、应用层面需要更高级别的路由功能和负载平衡;

4. Ingress基本概念

4.1 为何需要Ingress

service的三种方式ClusterIP、NodePort与LoadBalance,这几种方式都是在service的维度提供的,service的作用体现在两个方面,

对集群内部,它不断跟踪pod的变化,更新endpoint中对应pod的对象,提供了ip不断变化的pod的服务发现机制,

对集群外部,他类似负载均衡器,可以在集群内外部对pod进行访问。

单独用service暴露服务的方式,存在一些问题:

1.如果通过NodePort暴露端口过多,后期维护成本太大,且不易于管理;

2.ClusterIP的方式只能在集群内部访问

3.LoadBalance方式受限于云平台,且通常在云平台部署ELB还需要额外的费用

4.目前Service底层使用的是IptabLes、IPVS,仅支持4层协议,无法完成https协议传输;

Kubernetes为了解决这种需求,提供了一种高级的流量管理,也就是Ingress和Ingress控制器,Kubernetes使用Ingress控制器来接收所有入口的流量,然后通过Ingress资源来定义流量如何区分,以及流量如何转发的规则。

有了Ingress和Ingress控制器,我们就可以直接定义流量转发规则来发布服务,而无需创建一堆的NodePort和LoadBalance类型的Service.

4.2 什么是Ingress

Ingress其实就是Kubernetes中的一种资源,它主要是用来定义流量转发规则。但Ingress资源自身并不能实现流量的转发和调度,它仅仅是一组流量路由的规则集合,这些规则要真正发挥作用还需要使用到Ingress控制器,由Ingress控制器读取对应的Ingress规则,然后完成流量的路由或转发。

  • 原理图

Kubernetes 提出了一种新的 API 对象,叫做 Ingress,它通过定义不同的 HTTP 路由规则,将集群内部的 Service 通过 HTTP 的方式暴露到集群外部

image-20240520150107464

一组基于域名或URL把请求转发到指定Service实例的访问规则,是Kubernetes的一种资源对象,Ingress实例被存储在对象存储服务etcd中,通过接口服务被实现增、删、改、查的操作。

4.3 Ingress Controller

Ingress ControLler就是一类以代理HTTP/HTTPS协议为主的代理程序。如:Nginx、Traefik、Envoy、Haproxy。Ingress Controller通过Pod的形式运行在Kubernetes集群上,它能够与集群上的Pod直接通信。这样就可以让用户的流量经过Ingress控制器时直接调度到对应的Pod上。

Ingress Controller类似Nginx服务,它负责读取Ingress的规则,然后转换将规则转换为nginx.conf配置文件,这样就可以根据对应的规则来实现流量的调度。同时它还会实时感知后端Service对应的Pod变化,当Pod发生变动后,Ingress控制器会再次结合Ingress的规则,进而完成对应的配置动态更新。

用以实时监控资源对象Ingress、Service、End-point、Secret(主要是TLS证书和Key)、Node、ConfigMap的变化,自动对Nginx进行相应的操作

image-20240520153333822

❌ 注意

使用Ingress资源进行流量分发时,Ingress控制器可基于ingress定义的规则将客户端的请求流量直接转发至Service对应的后端Pod资源上。比如:用户请求api.xxx.net,Ingress控制器根据对应的规则直接将请求流量调度至Pod3或Pod4,而无需经过Service对象转发

4.4 Ingress的组成

Ingress资源是一种虚拟的资源和规则定义,需要配合ingressController才能生效。所以要让Ingress资源工作,集群必须有一个正在运行的ingressController。

Ingress由Ingress规则IngressControllerIngressClass这3部分组成。

Ingress规则只是一系列的配置,必须使用IngressController才能使其生效,而IngressClass是IngressController的具体实现.

image-20240524164700791

5. 与旧版相比

1,apiVersion: networking.k8s.io/v1(新版)

apiVersion: extensions/v1beta1(旧版)

2,新版取消了注解,也就是annotations(元数据这不用注解),统一使用ingressClassName(在spec模块使用)

3,ingress直接绑定的是ingress的服务,而旧版绑定的是节点ip:

4,新版新增pathType,旧版是使用注解

有3种支持的path类型:

ImplementationSpecific:对于这种path类型,匹配取决于IngressClass。可以将其视为一个单独的pathType或者将其认为和Prefix或者Exact路径类型一样。

Exact:精确匹配URL路径,并且区分大小写

Prefix: 根据URL中的,被/分割的前缀进行匹配。匹配区分大小写并且按照元素对路径进行匹配。path元素指的是路径中由/分隔符分隔的标签列表。

其他控制器

img

https://www.cnblogs.com/crazymakercircle/p/17270035.html

https://www.cnblogs.com/yinzhengjie/p/12271836.html

https://www.cnblogs.com/wangguishe/p/17159301.html