Ingress 定制配置

Ingress 定制配置,第1张

原文地址: https://alphahinex.github.io/2021/08/01/customize-ingress/

description: "最大化 Ingress 价值"

date: 2021.08.01 10:34

categories:

- K8s

tags: [K8s, Nginx]

keywords: K8s, Ingress, Ingress Controller, ingress-nginx, KIC, Kong Ingress Controller

K8s Ingress、Ingress Controller 和 Ingress Class 中介绍了 Ingress 相关的概念,接下来让我们看看如何对 Ingress 进行更加灵活的配置。

Ingress 的特性至 Kubernetes v1.19 进入了稳定状态,不论使用哪个具体的 Ingress Controller,这些配置都是生效的。

Ingress 中的每个 path 都需要有一个对应的 pathType ,共有三种类型:

例如:

主机名支持完全匹配和通配符匹配两种:

注意:host 中包含通配符时,通配符必须放在起始位置,即不可以设置为 foo.*.com

除了 Ingress 资源上的通用配置外,我们还可以针对所使用的具体的 Ingress Controller,通过注解的方式添加更灵活且丰富的配置。

这些注解通常由具体的 Controller 所提供,例如:

接下来让我们浏览几个 ingress-nginx 中的常用注解的作用及用法。

从 ingress-nginx 0.22.0 版本起,使用 nginx.ingress.kubernetes.io/rewrite-target 注解进行重写目标地址的配置,并且请求路径中的任意要在重写的路径中子路径,都必须明确的通过正则表达式的 捕获组 进行定义。捕获组以数字进行占位,按定义的先后顺序,表示为 $1 , $2 ... $n 。

在上面的配置中,请求路径 /demo-ui/ 后面的部分都会被 $2 所捕获,并作为参数传入 rewrite-target 注解中。

例如:

使用 nginx.ingress.kubernetes.io/app-root 注解可以设定根路径,例如:

此时,对 http://approot.bar.com/ 的访问,会被重定向到 http://approot.bar.com/app1 ,响应的 HTTP Status 是 302 Moved Temporarily 。

nginx.ingress.kubernetes.io/proxy-body-size 注解等同于 Nginx 中的 client_max_body_size ,可以设定允许的 request body 大小:

例如:

nginx.ingress.kubernetes.io/proxy-body-size: 8m

翻译自官网文档 Kubernetes-Ingress

管理对集群中的服务(通常是HTTP)的外部访问的API对象。Ingress可以提供负载平衡、SSL终端和基于名称的虚拟主机。

为清楚起见,本指南定义了以下术语:

ingress(在kubernetes v1.1时添加)暴露从集群外到集群内服务的 HTTP 或 HTTPS 路由。定义在 ingress 资源上的规则控制流量的路由。

一个 ingress 可以配置用于提供外部可访问的服务url、负载均衡流量、SSL终端和提供虚拟主机名配置。 ingress controller 负责实现(通常使用负载均衡器(loadbalancer))入口(ingress)。但是它也可以配置你的边缘路由器或额外的前端来帮助处理流量。

ingress 不暴露任何端口或协议。将HTTP和HTTPS之外的服务公开到因特网通常使用类型是NodePort或loadbalance的service。

一个最小的ingress示例:

和其他的kubernetes资源一样,ingress需要 apiVersion 、 kind 和 metadata 字段。

Ingress spec包含配置负载均衡器或代理服务器所需的所有信息。最重要的是,它包含一个针对所有传入请求匹配的规则列表。ingress资源只支持用于指导HTTP通信的规则

每一个HTTP规则包含以下信息:

默认后端通常配置在一个Ingress控制器中,该控制器将服务于任何与规范中的路径不匹配的请求。(404页面)

没有规则的ingress把所有的流量都转发到一个默认后端。默认后端通常是Ingress控制器的一个配置选项,并没有在Ingress资源中指定。

如果没有任何主机或路径匹配Ingress对象中的HTTP请求,则流量将路由到默认后端。

现有的Kubernetes概念允许您公开单个服务。您还可以通过指定一个没有规则的默认后端来对一个入口执行此 *** 作。

通过 kubectl apply -f <文件名>创建后,你可以看到:

其中107.178.254.228是入口控制器为满足该入口而分配的IP。

根据所请求的HTTP URI,扇出配置将流量从单个IP地址路由到多个服务。一个入口允许您将负载平衡器的数量保持到最小。例如,设置如下:

定义的ingress如下:

通过 kubectl apply -f <文件名>创建后:

只要服务(s1, s2)存在,Ingress控制器提供一个满足Ingress的特定于实现的负载均衡器。当它这样做时,您可以在address字段中看到负载均衡器的地址。

基于名称的虚拟主机支持将HTTP流量路由到同一IP地址的多个主机名。

下面的ingress告诉后台负载均衡器根据主机头路由请求。

如果您创建一个没有在规则中定义任何主机的Ingress资源,那么可以匹配到Ingress控制器IP地址的任何web流量,而不需要基于名称的虚拟主机。例如,下面的Ingress资源将把first.bar.com请求的流量路由到service1, second.foo.com路由到service2,将任何没有在request中定义主机名(即没有显示请求头)的流量路由到service3。

您可以通过指定包含TLS私钥和证书的秘密来保护ingress。目前,入口只支持一个TLS端口443,并假设TLS终端。如果一个入口中的TLS配置部分指定了不同的主机,那么它们将根据通过SNI TLS扩展指定的主机名在同一个端口上进行多路复用(前提是入口控制器支持SNI)。TLS密钥必须包含名为TLS的密钥。crt和tls。包含用于TLS的证书和私钥的密钥,例如:

在一个Ingress中引用这个 secret 将告诉Ingress控制器使用TLS保护从客户机到负载均衡器的通道。您需要确保您创建的TLS secret来自一个包含sslexample.foo.com CN的证书。

一个ingress controller 通过一些应用于所有入口的负载平衡策略设置来引导,例如负载平衡算法、后端权重方案等。更高级的负载平衡概念(例如持久会话、动态权重)还没有通过ingress公开。同样值得注意的是,尽管健康检查不是直接通过入口暴露的,但是在Kubernetes中也存在类似的概念,比如就绪探测,它允许您实现相同的最终结果。

上一篇文章介绍了 ingress vhost这个annotation的使用,趁热打铁我们一口气介绍 9 个常用的annotation。

如果一个k8s 集群里面部署多个ingress controller的时候,如果配置ingress 希望指定到某个ingress controller的时候,ingress claas就发挥巨大作用了。

一方面在controller启动的时候需要通过参数指定ingress class

另一方面,在创建ingress的时候,通过annotation指定ingress class,如下所示

nginx.ingress.kubernetes.io/force-ssl-redirect: "true"通过这个annotation可以强制 https,如果是http请求,会通过 301 redirect到 https。

nginx.org/proxy-connect-timeout 和nginx.org/proxy-read-timeout 这两个参数分别设置nginx的建立连接以及等待结果的超时时间。

我们经常将nginx作为api的网关,支持跨域必不可少。通过nginx.ingress.kubernetes.io/cors-allow-methods 设置支持跨域请求的方法。

限流也经常使用,通过 rps 限制每秒请求数,rpm 限制每分钟请求数,connections限制连接数。

这个主要是针对外部请求,防止将流量打满,proxy-body-size 设置最大请求 body,如果超过则会返回 413 请求错误。

这个主要是用于安全限制,只允许特定的客户端请求,但由于现在网络中NAT的广泛应用,这个参数使用的场景比较有限。

这个经常使用,当客户端请求一个不存在的path的时候,我们不希望返回 404 ,跳转到一个默认的服务上。

nginx ingress 默认是开启access log的,如果你想关闭,可以通过将 nginx.ingress.kubernetes.io/enable-access-log 设置成false。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11244651.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存