1. k8s ingress
1.1 什么是Ingress
Kubernetes Ingress 是一组路由规则,用于在集群外部和集群内部的服务之间进行 HTTP 和 HTTPS 路由。Ingress 允许你管理入站连接,并可以在集群中执行主机名和 URL 路径的路由、终端节点的负载均衡、重定向、SSL 终端等操作。
Ingress 控制器则是一个用于实现 Ingress 路由规则的组件,也就是说,它是 Ingress 资源对象在实际环境中的具体实现。可能有许多供选择的 Ingress 控制器,例如 Nginx、Traefik、HAProxy 等等。
如果以 Nginx 作为比喻,Ingress 就可以看做是 Nginx 的配置文件(比如 nginx.conf),用于定义如何处理 HTTP/HTTPS 请求。比如什么样的请求应该转发到哪个后端服务,是否需要开启 SSL,是否需要进行 URL 重写等等。
而 Ingress 控制器就相当于 Nginx 服务器本身,它读取和理解这个配置文件,然后根据配置来处理实际的网络请求。
对于 Kubernetes 和 Nginx Ingress 控制器,Ingress 资源定义了各种路由规则,而 Nginx Ingress 控制器则负责将这些规则转化为实际的 Nginx 服务器配置,并且会持续监听这些规则的变化并实时更新 Nginx 配置。
这样,管理员只需要关心抽象的 Ingress 规则,而不需要直接去修改复杂的 Nginx 配置。同时在不同的环境下,也可以通过切换不同的 Ingress 控制器(比如从 Nginx 切换到 Traefik),而不需要修改 Ingress 规则。
1.2 有哪些Ingress?
k8s有很多Ingress, 以下是一些常见的Ingress:
以下是一些常见的 Kubernetes Ingress 控制器:
-
NGINX Ingress Controller: 这是最常用的 Ingress 控制器,由 NGINX 官方团队维护,支持标准的 HTTP/HTTPS,以及 TCP 和 UDP 的负载均衡。NGINX Plus Ingress Controller 包含更多高级特性,如 JWT 认证,请求率限制等。
-
Traefik: Traefik 是一个现代 HTTP 反向代理、负载均衡器,同时也是一个 Ingress 控制器。它支持多种后端服务,如 Kubernetes、Docker 等。
-
HAProxy Ingress: HAProxy Ingress 是基于 HAProxy 的 Kubernetes Ingress 控制器,HAProxy 历来以其健壮性、性能和可靠性受到赞誉。
-
Istio Gateway: Istio 是服务网格的一种实现,而 Istio Gateway 就是作为 Ingress 控制器,可以对接入的流量进行复杂的路由规则控制。
-
Kong Ingress Controller:Kong Ingress Controller 除了基本的路由功能外,还可以处理身份验证、流量控制、服务发现等高级功能。
-
AWS Application Load Balancer (ALB) Ingress Controller:这是 AWS 提供的 Ingress 控制器,用于将流量路由到 AWS 的 Application Load Balancer (ALB)。使用它,你可以利用 AWS 的弹性和可扩展特性。
-
Google Cloud HTTP(s) Load Balancer (GCE) Ingress Controller: 这是 Google Cloud 提供的 Ingress 控制器,可以将流量路由到 Google Cloud 的 HTTP(s) 负载均衡器。
这些 Ingress 控制器各有特色,选择哪个主要取决于你的实际需求和你的部署环境。
更多Ingress可以参考k8s官网:Ingress Controllers
Ingress 路由规则
基于Host
这是请求域名的匹配规则,如果没有指定,那么规则会应用到所有的域名。
基于Path
这定义了 URL 路径的匹配模式,对应到后端的服务。
基于Backend
这定义了请求应该路由到哪个服务以及服务的端口。
基于TLS
这定义了如何处理 TLS,包括用于 HTTPS 的证书和关联的域名列表。
举例说明
请看这个Ingress声明:
apiVersion: networking.k8s.io/v1
# 资源类型是Ingress
kind: Ingress
metadata:
name: example-ingress
# annotations
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-methods: "GET, PUT, POST, DELETE, PATCH, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-headers : "*"
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"
spec:
# Ingress类型,这里是Ingress,不同的Ingress提供上Class名称不一致,具体可以参考提供商的文档,这里使用的ingress-nginx,所以Class名称为Nginx
ingressClass: Nginx
rules:
# 基于Host路由规则
- host: myapp.mydomain.com
http:
paths:
# 基于Path路由规则
- path: /service1/(.*)
pathType: ImplementationSpecific
# 基于Backend路由规则
backend:
serviceName: service1
servicePort: 80
- path: /service2/(.*)
pathType: ImplementationSpecific
backend:
serviceName: service2
servicePort: 80
# 指定域名TLS
tls:
- hosts:
- myapp.mydomain.com
secretName: myapp-tls-secret
pathType类型
在 Kubernetes Ingress 中,path 是一种路由规则,它定义了某个 HTTP 请求路径应当被如何处理。具体来说,path 定义了 URL 路径的匹配模式和这个模式对应的后端服务。
在 Kubernetes 1.18 版本之前,Ingress 的路径被视为一种简单的字符串,没有明确定义如何进行匹配。因此,如何解释和使用 path 取决于您的 Ingress 控制器,不同的控制器可能有不同的行为。
从 Kubernetes 1.18 版本开始,在 Ingress API networking.k8s.io/v1 中引入了 pathType 字段,以便更明确地定义路径匹配的行为。pathType 可以有以下几个值:
-
Exact:表示只有当请求路径和设置的 path 完全相等时,这条路由规则才生效。例如,如果 path 设置为 /foo,那么只有 /foo 这个路径的请求才会匹配,而 /foo/、/foo/bar 或 /foobar 这样的路径不会匹配。
-
Prefix:表示只要请求路径以设置的 path 作为前缀,这条路由规则就会生效。例如,如果 path 为 /foo,那么 /foo、/foo/、/foo/bar、/foobar 这样的路径都会匹配。
-
ImplementationSpecific: 表示路径匹配的行为取决于具体的 Ingress 控制器,这是兼容早期 Ingress 规范的一个方式。
- 如果没有指定 pathType,则默认pathType为
ImplementationSpecific
。
Ingress annotations
Ingress 的 annotations(注解)是 Kubernetes 提供的一种方式,用于为 Ingress 控制器附加额外的配置或行为。通过使用 annotations,我们可以更灵活地为 Ingress 控制器添加和修改特定的设置,而不需要直接修改 Ingress 控制器的代码或配置。
每个 Ingress 控制器可能支持一组特定的 annotations,并根据这些 annotations 执行相应的行为。常见的一些 annotations 可能包括以下功能:
-
自定义 HTTP/HTTPS 重定向:你可以使用 annotations 来控制是否需要对 HTTP 请求进行 HTTPS 重定向。
-
配置 SSL/TLS:可以使用 annotations 来配置 SSL/TLS ,如是否启用自动 HTTP 到 HTTPS 的重定向、证书等。
-
设置负载均衡算法:某些 Ingress 控制器允许你通过 annotations 设置负载均衡算法,比如轮询、最少连接等。
-
设置会话粘滞性:可以通过 annotations 为服务启用会话粘滞性,以确保用户的所有请求都被路由到同一 Pod。
-
配置访问日志和错误日志:Annotations 可以用来控制 Ingress 对访问日志和错误日志的处理,例如开启或关闭日志,设置日志格式,等等。
-
配置防火墙规则、CORS 策略、gzip 压缩等:根据具体的 Ingress 控制器的实现,annotations 可以支持各种各样的功能。
每个 annotations 都有一个特定的 key 和 value,key 通常是一个带有前缀的字符串,如 nginx.ingress.kubernetes.io/rewrite-target
,value 是对应的配置值。
在 Ingress 资源的 yaml 文件中,annotations 作为元数据的一部分定义在 metadata.annotations 字段下。例如:
apiVersion: networking.k8s.io/v1
# 资源类型是Ingress
kind: Ingress
metadata:
name: example-ingress
# annotations
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-methods: "GET, PUT, POST, DELETE, PATCH, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-headers : "*"
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"
spec:
# Ingress类型,这里是Ingress,不同的Ingress提供上Class名称不一致,具体可以参考提供商的文档,这里使用的ingress-nginx,所以Class名称为Nginx
ingressClass: Nginx
rules:
# 基于Host路由规则
- host: myapp.mydomain.com
http:
paths:
# 基于Path路由规则
- path: /service1/(.*)
pathType: ImplementationSpecific
# 基于Backend路由规则
backend:
serviceName: service1
servicePort: 80
- path: /service2/(.*)
pathType: ImplementationSpecific
backend:
serviceName: service2
servicePort: 80
# 指定域名TLS
tls:
- hosts:
- myapp.mydomain.com
secretName: myapp-tls-secret
在这个例子中,使用annotations
定义了路径重写
和跨域配置
,比如我们的rewrite规则是:如果请求路径是/service1/a/b/c
,那么请求路径被转发到backend服务时路径被rewrite为/a/b/c
(注意:这个是ingress-nginx)。
ingress-nginx
Ingress-nginx 是一个用于管理 Kubernetes Ingresses 的控制器,它使用 NGINX 开源 web 服务器作为反向代理和负载均衡器。
以下是关于 ingress-nginx 的一些主要要点:
路由: Ingress-nginx 用于处理集群外部的请求,根据定义在 Ingress 资源中的规则将请求路由到集群内部的 Service。它可以根据请求的主机名和 URL 路径进行路由。
负载平衡: Ingress-nginx 具有负载均衡的能力,可以将流量分发给后端的多个 Pod。
SSL / TLS 终止: Ingress-nginx 支持 SSL / TLS 终止,可以对 HTTPS 请求进行解密,并将解密后的请求发送给后端的服务。
注解: Ingress-nginx 支持多种注解,可以通过注解来改变默认的行为,包括设置负载平衡算法,开启会话粘滞性,修改超时,调整缓存,开启或关闭各种日志,等等。
自定义配置: Ingress-nginx 提供了丰富的自定义选项,可以通过修改 ConfigMap 或使用注解来自定义它的行为。
扩展性和灵活性: Ingress-nginx 可以很容易地扩展以处理大量的请求,并且可以灵活地应对各种流量模式和复杂的路由规则。
总结
Kubernetes Ingress 是一种将集群外部的 HTTP 和 HTTPS 路由到集群内部服务的方法,包括主机名、URL路径、负载均衡等路由规则,以及对应的后端服务。Ingress 控制器则是具体实现这些路由规则的,常见的有 Nginx、Traefik、HAProxy 等等。
-
基于Host的路由规则,是对请求域名的匹配规则。
-
基于Path的路由规则,利用 URL 的路径匹配模式,对应到后端的服务。
-
基于Backend的路由规则,定义了请求应该路由到哪个服务以及服务的端口。
-
基于TLS的路由规则,定义了如何处理 TLS,包括用于 HTTPS 的证书和关联的域名列表。
Annotations 是 Kubernetes 提供的一种方式,用于为 Ingress 控制器附加额外的配置或行为。比如自定义 HTTP/HTTPS 重定向、配置 SSL/TLS、设置负载均衡算法、设置会话粘滞性、配置访问日志和错误日志,以及配置防火墙规则、CORS 策略、gzip 压缩等。
Ingress-nginx 是一个用于管理 Kubernetes Ingress 的控制器,它在采用nginx做为反向代理和负载均衡器。它负责管理和执行 Ingress 资源定义的路由规则,接收集群外部的请求,并根据定义的规则将请求路由到集群内部的 Service,在此过程中它可以执行诸如主机名和 URL 路径的匹配、负载均衡、SSL/TLS 终止、路径重写等操作。