原文地址: 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。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)