- 注解
- Canary
- Rewrite
- Session
- 会话亲和性 (Session Affinity)
- 认证 (Authentication)
- 自定义 NGINX 上游哈希 (Custom NGINX Upstream Hashing)
- 自定义 NGINX 负载均衡 (Custom NGINX Load Balancing)
- 自定义 NGINX 上游虚拟主机 (Custom NGINX Upstream Vhost)
- 客户端证书认证 (Client Certificate Authentication)
- 后端证书认证 (Backend Certificate Authentication)
- 配置片段 (Configuration Snippet)
- 自定义 HTTP 错误 (Custom HTTP Errors)
- 自定义头信息 (Custom Headers)
- 默认后端 (Default Backend)
- 启用 CORS (Enable CORS)
- HTTP2 推送预加载 (HTTP2 Push Preload)
- 服务器别名 (Server Alias)
- 服务器片段 (Server Snippet)
- 客户端请求体缓冲区大小 (Client Body Buffer Size)
- 外部认证 (External Authentication)
- 速率限制 (Rate Limiting)
- 永久重定向 (Permanent Redirect)
- 永久重定向码 (Permanent Redirect Code)
- 临时重定向 (Temporal Redirect)
- 临时重定向码 (Temporal Redirect Code)
- SSL 透传 (SSL Passthrough)
- 服务上游 (Service Upstream)
- 服务器端 HTTPS 强制重定向 (Server-side HTTPS Enforcement Through Redirect)
- 从/到 www 重定向 (Redirect From/To www)
- 拒绝列表源范围 (Denylist Source Range)
- 允许列表源范围 (Whitelist Source Range)
注解
你可以为特定的 Ingress 对象添加这些 Kubernetes 注解来自定义其行为。
提示
注解的键和值只能是字符串类型。其他类型(如布尔值或数值)必须加上引号,例如 "true"
、"false"
、"100"
。
注解前缀可以通过
--annotations-prefix
命令行参数 修改,但默认值为nginx.ingress.kubernetes.io
,如下表所示。
Canary
在某些情况下,你可能希望通过将少量请求发送到与生产服务不同的服务来“金丝雀”测试一组新变更。金丝雀注解使 Ingress 规范能够根据应用的规则作为替代服务路由请求。在设置 nginx.ingress.kubernetes.io/canary: "true"
后,可以启用以下配置金丝雀的注解:
• nginx.ingress.kubernetes.io/canary-by-header
:用于通知 Ingress 将请求路由到金丝雀 Ingress 中指定的服务的请求头。当请求头设置为 always
时,请求将被路由到金丝雀服务。当请求头设置为 never
时,请求永远不会被路由到金丝雀服务。对于任何其他值,请求头将被忽略,并根据优先级与其他金丝雀规则进行比较。
• nginx.ingress.kubernetes.io/canary-by-header-value
:用于匹配通知 Ingress 将请求路由到金丝雀 Ingress 中指定的服务的请求头值。当请求头设置为该值时,请求将被路由到金丝雀服务。对于任何其他请求头值,请求头将被忽略,并根据优先级与其他金丝雀规则进行比较。此注解必须与 nginx.ingress.kubernetes.io/canary-by-header
一起使用。该注解是 nginx.ingress.kubernetes.io/canary-by-header
的扩展,允许自定义请求头值而不是使用硬编码值。如果未定义 nginx.ingress.kubernetes.io/canary-by-header
注解,则此注解无效。
• nginx.ingress.kubernetes.io/canary-by-header-pattern
:其工作方式与 canary-by-header-value
相同,只是它使用 PCRE 正则表达式匹配。注意,当设置了 canary-by-header-value
时,此注解将被忽略。当给定的正则表达式在请求处理期间导致错误时,请求将被视为不匹配。
• nginx.ingress.kubernetes.io/canary-by-cookie
:用于通知 Ingress 将请求路由到金丝雀 Ingress 中指定的服务的 Cookie。当 Cookie 值设置为 always
时,请求将被路由到金丝雀服务。当 Cookie 值设置为 never
时,请求永远不会被路由到金丝雀服务。对于任何其他值,Cookie 将被忽略,并根据优先级与其他金丝雀规则进行比较。
• nginx.ingress.kubernetes.io/canary-weight
:基于整数(0 - )的随机请求百分比,应路由到金丝雀 Ingress 中指定的服务。权重为 0 表示不会通过此金丝雀规则将任何请求发送到金丝雀 Ingress 中的服务。权重为 <weight-total>
表示所有请求都将发送到 Ingress 中指定的替代服务。<weight-total>
默认为 100,可以通过 nginx.ingress.kubernetes.io/canary-weight-total
增加。
• nginx.ingress.kubernetes.io/canary-weight-total
:流量的总权重。如果未指定,则默认为 100。
金丝雀规则按优先级顺序评估。优先级如下:canary-by-header -> canary-by-cookie -> canary-weight
注意,当你将一个 Ingress 标记为金丝雀时,所有其他非金丝雀注解将被忽略(从相应的主 Ingress 继承),除了 nginx.ingress.kubernetes.io/load-balance
、nginx.ingress.kubernetes.io/upstream-hash-by
和 与会话亲和性相关的注解。如果你想恢复金丝雀的原始行为(当会话亲和性被忽略时),可以在金丝雀 Ingress 定义上设置值为 legacy
的 nginx.ingress.kubernetes.io/affinity-canary-behavior
注解。
已知限制
目前每个 Ingress 规则最多只能应用一个金丝雀 Ingress。
Rewrite
在某些场景中,后端服务暴露的 URL 与 Ingress 规则中指定的路径不同。如果没有重写,任何请求都将返回 404。将注解 nginx.ingress.kubernetes.io/rewrite-target
设置为服务期望的路径。
如果应用根目录暴露在不同的路径中并需要重定向,设置注解 nginx.ingress.kubernetes.io/app-root
以重定向 /
的请求。
示例
请查看 rewrite 示例。
Session
会话亲和性 (Session Affinity)
注解 nginx.ingress.kubernetes.io/affinity
会在 Ingress 的所有上游中启用并设置亲和性类型。这样,请求将始终被定向到同一个上游服务器。NGINX 唯一可用的亲和性类型是 cookie
。
注解 nginx.ingress.kubernetes.io/affinity-mode
定义会话的粘性。设置为 balanced
(默认值)会在部署扩展时重新分配部分会话,从而重新平衡服务器上的负载。设置为 persistent
则不会将会话重新平衡到新服务器,从而提供最大的粘性。
注解 nginx.ingress.kubernetes.io/affinity-canary-behavior
定义了启用会话亲和性时金丝雀的行为。设置为 sticky
(默认值)会确保由金丝雀服务的用户继续由金丝雀服务。设置为 legacy
会恢复原始的金丝雀行为,即忽略会话亲和性。
注意
如果为一个主机定义了多个 Ingress,并且至少有一个 Ingress 使用了 nginx.ingress.kubernetes.io/affinity: cookie
,那么只有使用 nginx.ingress.kubernetes.io/affinity
的 Ingress 上的路径会使用会话 Cookie 亲和性。为该主机定义的其他 Ingress 上的所有路径将通过随机选择后端服务器进行负载均衡。
示例
请查看 affinity 示例。
Cookie 亲和性
如果使用 cookie
亲和性类型,还可以通过注解 nginx.ingress.kubernetes.io/session-cookie-name
指定用于路由请求的 Cookie 名称。默认会创建一个名为 INGRESSCOOKIE
的 Cookie。
NGINX 注解 nginx.ingress.kubernetes.io/session-cookie-path
定义了将在 Cookie 上设置的路径。除非注解 nginx.ingress.kubernetes.io/use-regex
设置为 true,否则此字段是可选的;会话 Cookie 路径不支持正则表达式。
使用 nginx.ingress.kubernetes.io/session-cookie-domain
设置粘性 Cookie 的 Domain
属性。
使用 nginx.ingress.kubernetes.io/session-cookie-samesite
为粘性 Cookie 应用 SameSite
属性。浏览器接受的值为 None
、Lax
和 Strict
。某些浏览器会拒绝带有 SameSite=None
的 Cookie,包括在 SameSite=None
规范之前创建的 Cookie(例如 Chrome 5X)。其他浏览器错误地将 SameSite=None
Cookie 视为 SameSite=Strict
(例如运行在 OSX 14 上的 Safari)。为了在这些不兼容的浏览器中省略 SameSite=None
,可以添加注解 nginx.ingress.kubernetes.io/session-cookie-conditional-samesite-none: "true"
。
使用 nginx.ingress.kubernetes.io/session-cookie-expires
控制 Cookie 的过期时间,其值为 Cookie 过期的秒数。
当 use-regex
设置为 true 时,使用 nginx.ingress.kubernetes.io/session-cookie-path
控制 Cookie 路径。
使用 nginx.ingress.kubernetes.io/session-cookie-change-on-failure
控制请求失败后的 Cookie 变更。
认证 (Authentication)
可以通过在 Ingress 规则中添加额外的注解来添加认证。认证的来源是一个包含用户名和密码的 Secret。
相关注解包括:
nginx.ingress.kubernetes.io/auth-type: [basic|digest]
指示 HTTP 认证类型:Basic 或 Digest 访问认证。
nginx.ingress.kubernetes.io/auth-secret: secretName
包含被授予访问 Ingress 规则中定义的 path
的用户名和密码的 Secret 名称。此注解也接受替代形式 “namespace/secretName”,此时 Secret 查找将在引用的命名空间而不是 Ingress 命名空间中进行。
nginx.ingress.kubernetes.io/auth-secret-type: [auth-file|auth-map]
auth-secret
可以有两种形式:
• auth-file
- 默认值,Secret 中 auth
键下的 htpasswd 文件
• auth-map
- Secret 的键是用户名,值是哈希后的密码
nginx.ingress.kubernetes.io/auth-realm: "realm string"
示例
请查看 auth 示例。
自定义 NGINX 上游哈希 (Custom NGINX Upstream Hashing)
NGINX 支持基于 一致性哈希 的客户端-服务器映射负载均衡。键可以包含文本、变量或其组合。此功能允许除客户端 IP 或 Cookie 之外的请求粘性。将使用 ketama 一致性哈希方法,确保在上游组变更时只有少量键会被重新映射到不同的服务器。
有一种特殊的上游哈希模式称为子集(subset)。在此模式下,上游服务器被分组为子集,粘性通过将键映射到子集而不是单个上游服务器来实现。从选定的粘性子集中均匀随机选择特定服务器。它在粘性和负载分配之间提供了平衡。
要为后端启用一致性哈希:
nginx.ingress.kubernetes.io/upstream-hash-by
:用于一致性哈希的 NGINX 变量、文本值或其组合。例如:nginx.ingress.kubernetes.io/upstream-hash-by: "$request_uri"
或 nginx.ingress.kubernetes.io/upstream-hash-by: "$request_uri$host"
或 nginx.ingress.kubernetes.io/upstream-hash-by: "${request_uri}-text-value"
以当前请求 URI 一致哈希上游请求。
可以通过设置 nginx.ingress.kubernetes.io/upstream-hash-by-subset: "true"
启用 “子集” 哈希。这将请求映射到节点子集而不是单个节点。nginx.ingress.kubernetes.io/upstream-hash-by-subset-size
确定每个子集的大小(默认为 3)。
请查看 chashsubset 示例。
自定义 NGINX 负载均衡 (Custom NGINX Load Balancing)
这与 ConfigMap 中的 load-balance
类似,但按 Ingress 配置负载均衡算法。
注意,
nginx.ingress.kubernetes.io/upstream-hash-by
优先于此设置。如果未设置此注解和nginx.ingress.kubernetes.io/upstream-hash-by
,则回退到全局配置的负载均衡算法。
自定义 NGINX 上游虚拟主机 (Custom NGINX Upstream Vhost)
此配置设置允许你控制以下语句中的主机值:proxy_set_header Host $host
,这是 location 块的一部分。如果你需要通过不同于 $host
的方式调用上游服务器,这将非常有用。
客户端证书认证 (Client Certificate Authentication)
可以通过在 Ingress 规则中添加额外的注解来启用客户端证书认证。
客户端证书认证按主机应用,无法为单个路径指定不同的规则。
要启用,添加注解 nginx.ingress.kubernetes.io/auth-tls-secret: namespace/secretName
。此 Secret 必须包含名为 ca.crt
的文件,其中包含用于对此 Ingress 进行认证的完整证书颁发机构链 ca.crt
。
你可以通过以下注解进一步自定义客户端证书认证和行为:
• nginx.ingress.kubernetes.io/auth-tls-verify-depth
:提供的客户端证书与证书颁发机构链之间的验证深度。(默认:1)
• nginx.ingress.kubernetes.io/auth-tls-verify-client
:启用客户端证书验证。可能的值包括:
• on
:请求一个客户端证书,该证书必须由包含在 nginx.ingress.kubernetes.io/auth-tls-secret: namespace/secretName
指定的 Secret 的 ca.crt
键中的证书签名。证书验证失败将导致状态码 400(Bad Request)(默认值)。
• off
:不请求客户端证书,也不进行客户端证书验证。
• optional
:对来自 auth-tls-secret
的 CA 进行可选的客户端证书验证。当提供的证书未被 CA 签名时,请求将失败并返回状态码 400(Bad Request)。当未提供证书或提供其他无效证书时,请求不会失败,但验证结果会发送到上游服务。
• optional_no_ca
:进行可选的客户端证书验证,但当客户端证书未被 auth-tls-secret
中的 CA 签名时不使请求失败。证书验证结果会发送到上游服务。
• nginx.ingress.kubernetes.io/auth-tls-error-page
:在证书认证错误时应将用户重定向到的 URL/页面。
• nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream
:指示是否应将接收到的证书传递到上游服务器的 ssl-client-cert
头中。可能的值是 “true” 或 “false”(默认值)。
• nginx.ingress.kubernetes.io/auth-tls-match-cn
:添加对客户端证书 CN 的检查,使用以 “CN=” 开头的字符串/正则表达式,例如 "CN=myvalidclient"
。如果在 mTLS 期间发送的证书 CN 与你的字符串/正则表达式不匹配,将返回状态码 403。另一种使用方式是在正则表达式中添加多个选项,例如 "CN=(option1|option2|myvalidclient)"
。在这种情况下,只要括号中的选项之一与证书 CN 匹配,你将收到 200 状态码。
根据 auth-tls-*
注解,以下头信息会被发送到上游服务:
• ssl-client-issuer-dn
:客户端证书的颁发者信息。例如:”CN=My CA”
• ssl-client-subject-dn
:客户端证书的主题信息。例如:”CN=My Client”
• ssl-client-verify
:客户端验证的结果。可能的值:”SUCCESS”, “FAILED: “
• ssl-client-cert
:PEM 格式的完整客户端证书。仅当 nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream
设置为 “true” 时发送。例如:-----BEGIN%20CERTIFICATE-----%0A...---END%20CERTIFICATE-----%0A
示例
请查看 client-certs 示例。
注意
在 Cloudflare 中无法使用带有客户端认证的 TLS,并可能导致意外行为。
Cloudflare 仅允许认证的源拉取(Authenticated Origin Pulls),并且需要使用他们自己的证书:https://blog.cloudflare.com/protecting-the-origin-with-tls-authenticated-origin-pulls/
仅允许认证的源拉取,可以通过以下教程配置:https://support.cloudflare.com/hc/en-us/articles/204494148-Setting-up-NGINX-to-use-TLS-Authenticated-Origin-Pulls
后端证书认证 (Backend Certificate Authentication)
可以通过在 Ingress 规则中添加额外的注解,使用证书对代理的 HTTPS 后端进行认证。
• nginx.ingress.kubernetes.io/proxy-ssl-secret: secretName
:指定一个 Secret,其中包含用于对代理的 HTTPS 服务器进行认证的证书 tls.crt
、密钥 tls.key
(PEM 格式)。它还应该包含受信任的 CA 证书 ca.crt
(PEM 格式),用于验证代理的 HTTPS 服务器的证书。此注解期望 Secret 名称的形式为 “namespace/secretName”。
• nginx.ingress.kubernetes.io/proxy-ssl-verify
:启用或禁用对代理的 HTTPS 服务器证书的验证。(默认:off)
• nginx.ingress.kubernetes.io/proxy-ssl-verify-depth
:设置代理的 HTTPS 服务器证书链中的验证深度。(默认:1)
• nginx.ingress.kubernetes.io/proxy-ssl-ciphers
:指定对代理的 HTTPS 服务器请求启用的 密码。密码以 OpenSSL 库理解的格式指定。
• nginx.ingress.kubernetes.io/proxy-ssl-name
:允许设置 proxy_ssl_name。这允许覆盖用于验证代理的 HTTPS 服务器证书的服务器名称。此值还会在建立与代理的 HTTPS 服务器的连接时通过 SNI 传递。
• nginx.ingress.kubernetes.io/proxy-ssl-protocols
:启用对代理的 HTTPS 服务器请求的指定 协议。
• nginx.ingress.kubernetes.io/proxy-ssl-server-name
:启用通过 TLS 服务器名称指示扩展(SNI,RFC 6066)传递服务器名称,以建立与代理的 HTTPS 服务器的连接。
配置片段 (Configuration Snippet)
使用此注解,你可以向 NGINX location 添加额外的配置。例如:
nginx.ingress.kubernetes.io/configuration-snippet: |
more_set_headers "Request-Id: $req_id";
请注意,这在多租户集群中可能是危险的,因为它可能导致权限受限的人能够检索集群上的所有 Secret。建议的缓解措施是禁用此功能,因此它可能对你无效。有关更多信息,请参阅 CVE-2021-25742 和 GitHub 上的相关问题。
自定义 HTTP 错误 (Custom HTTP Errors)
与 ConfigMap 中的 custom-http-errors
值类似,此注解将为与此 Ingress 关联的 NGINX location 设置 NGINX proxy-intercept-errors
。如果在 Ingress 上指定了 default backend 注解,错误将被路由到该注解的默认后端服务(而不是全局默认后端)。不同的 Ingress 可以指定不同的错误代码集。即使多个 Ingress 对象共享相同的主机名,此注解也可以用于为每个 Ingress 拦截不同的错误代码(例如,如果同一主机名上的不同路径位于不同的 Ingress 上,则可以拦截不同的错误代码)。如果还全局指定了 custom-http-errors
,则此注解中指定的错误值将覆盖给定 Ingress 主机名和路径的全局值。
示例用法:
nginx.ingress.kubernetes.io/custom-http-errors: "404,415"
自定义头信息 (Custom Headers)
此注解的形式为 nginx.ingress.kubernetes.io/custom-headers: <namespace>/<custom headers configmap>
,用于指定包含自定义头信息的命名空间和 ConfigMap 名称。此注解使用 more_set_headers
NGINX 指令。
以下示例注解对应的 ConfigMap 示例:
nginx.ingress.kubernetes.io/custom-headers: default/custom-headers-configmap
示例 ConfigMap:
apiVersion: v1
data:
Content-Type: application/json
kind: ConfigMap
metadata:
name: custom-headers-configmap
namespace: default
注意
首先在 global-allowed-response-headers 中定义允许的响应头。
默认后端 (Default Backend)
此注解的形式为 nginx.ingress.kubernetes.io/default-backend: <svc name>
,用于指定自定义的默认后端。<svc name>
是对你应用此注解的同一命名空间中的服务的引用。此注解会覆盖全局默认后端。如果服务有 多个端口,第一个端口将接收后端流量。
当 Ingress 规则中配置的服务没有任何活动端点时,将使用此服务处理响应。如果同时设置了此注解和 custom-http-errors 注解,它还将用于处理错误响应。
启用 CORS (Enable CORS)
要在 Ingress 规则中启用跨源资源共享(CORS),添加注解 nginx.ingress.kubernetes.io/enable-cors: "true"
。这将在服务器 location 中添加一个启用此功能的配置部分。
可以通过以下注解控制 CORS:
• nginx.ingress.kubernetes.io/cors-allow-methods
:控制接受哪些方法。
这是一个多值字段,用 ‘,’ 分隔,仅接受字母(大小写)。
• 默认值:GET, PUT, POST, DELETE, PATCH, OPTIONS
• 示例:nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS"
• nginx.ingress.kubernetes.io/cors-allow-headers
:控制接受哪些头信息。
这是一个多值字段,用 ‘,’ 分隔,接受字母、数字、_ 和 -。
• 默认值:DNT,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization
• 示例:nginx.ingress.kubernetes.io/cors-allow-headers: "X-Forwarded-For, X-app123-XPTO"
• nginx.ingress.kubernetes.io/cors-expose-headers
:控制哪些头信息暴露给响应。
这是一个多值字段,用 ‘,’ 分隔,接受字母、数字、_、- 和 *。
• 默认值:空
• 示例:nginx.ingress.kubernetes.io/cors-expose-headers: "*, X-CustomResponseHeader"
• nginx.ingress.kubernetes.io/cors-allow-origin
:控制 CORS 接受的 Origin。
这是一个多值字段,用 ‘,’ 分隔。必须遵循以下格式:protocol://origin-site.com
或 protocol://origin-site.com:port
• 默认值:*
• 示例:nginx.ingress.kubernetes.io/cors-allow-origin: "https://origin-site.com:4443, http://origin-site.com, myprotocol://example.org:1199"
它还支持单级通配符子域名,格式为:protocol://*.foo.bar
、protocol://*.bar.foo:8080
或 protocol://*.abc.bar.foo:9000
示例:nginx.ingress.kubernetes.io/cors-allow-origin: "https://*.origin-site.com:4443, http://*.origin-site.com, myprotocol://example.org:1199"
• nginx.ingress.kubernetes.io/cors-allow-credentials
:控制在 CORS 操作期间是否可以传递凭据。
• 默认值:true
• 示例:nginx.ingress.kubernetes.io/cors-allow-credentials: "false"
• nginx.ingress.kubernetes.io/cors-max-age
:控制预检请求可以缓存的时间。
• 默认值:1728000
• 示例:nginx.ingress.kubernetes.io/cors-max-age: 600
注意
更多信息请参阅 https://enable-cors.org
HTTP2 推送预加载 (HTTP2 Push Preload)
启用自动将 “Link” 响应头字段中指定的预加载链接转换为推送请求。
示例
• nginx.ingress.kubernetes.io/http2-push-preload: "true"
服务器别名 (Server Alias)
通过注解 nginx.ingress.kubernetes.io/server-alias: "<alias 1>,<alias 2>"
可以在 NGINX 配置的服务器定义中添加一个或多个别名。这将创建一个具有相同配置的服务器,但会向 server_name
指令添加新值。
注意
服务器别名不能与现有服务器的主机名冲突。如果发生冲突,服务器别名注解将被忽略。如果创建了一个服务器别名,之后又创建了一个具有相同主机名的新服务器,新服务器的配置将覆盖别名配置。
更多信息请参阅 server_name
文档。
服务器片段 (Server Snippet)
使用注解 nginx.ingress.kubernetes.io/server-snippet
可以在服务器配置块中添加自定义配置。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/server-snippet: |
set $agentflag 0;
if ($http_user_agent ~* "(Mobile)" ){
set $agentflag 1;
}
if ( $agentflag = 1 ) {
return 301 https://m.example.com;
}
注意
此注解每个主机只能使用一次。
客户端请求体缓冲区大小 (Client Body Buffer Size)
设置用于读取客户端请求体的缓冲区大小(按 location)。如果请求体大于缓冲区,整个请求体或其部分将被写入临时文件。默认情况下,缓冲区大小等于两个内存页。在 x86、其他 32 位平台和 x86-64 上为 8K。在其他 64 位平台上通常为 16K。此注解应用于 Ingress 规则中提供的每个 location。
注意
注解值必须采用 NGINX 理解的格式。
示例
• nginx.ingress.kubernetes.io/client-body-buffer-size: "1000"
# 1000 字节
• nginx.ingress.kubernetes.io/client-body-buffer-size: 1k
# 1 千字节
• nginx.ingress.kubernetes.io/client-body-buffer-size: 1K
# 1 千字节
• nginx.ingress.kubernetes.io/client-body-buffer-size: 1m
# 1 兆字节
• nginx.ingress.kubernetes.io/client-body-buffer-size: 1M
# 1 兆字节
更多信息请参阅 https://nginx.org
外部认证 (External Authentication)
要使用提供认证的现有服务,可以在 Ingress 规则中添加注解 nginx.ingress.kubernetes.io/auth-url
,指示应将 HTTP 请求发送到的 URL。
nginx.ingress.kubernetes.io/auth-url: "URL to the authentication service"
此外,还可以设置:
• nginx.ingress.kubernetes.io/auth-keepalive
: <Connections>
指定与 auth-url
的最大保持活动连接数。仅当 URL 的主机部分不使用变量时生效。默认为 0
(禁用保持活动)。
• nginx.ingress.kubernetes.io/auth-keepalive-share-vars
: 是否在当前请求和认证请求之间共享 NGINX 变量。示例用例是跟踪请求:当设置为 “true” 时,后端和认证请求的 X-Request-ID HTTP 头将相同。默认为 “false”。
• nginx.ingress.kubernetes.io/auth-keepalive-requests
: <Requests>
指定通过一个保持活动连接可以服务的最大请求数。默认为 1000
,仅在 auth-keepalive
设置为大于 0
时应用。
• nginx.ingress.kubernetes.io/auth-keepalive-timeout
: <Timeout>
指定空闲保持活动连接保持打开的持续时间(秒)。默认为 60
,仅在 auth-keepalive
设置为大于 0
时应用。
• nginx.ingress.kubernetes.io/auth-method
: <Method>
指定使用的 HTTP 方法。
• nginx.ingress.kubernetes.io/auth-signin
: <SignIn_URL>
指定错误页面的位置。
• nginx.ingress.kubernetes.io/auth-signin-redirect-param
: <SignIn_URL>
指定错误页面中应包含失败登录请求原始 URL 的 URL 参数。
• nginx.ingress.kubernetes.io/auth-response-headers
: <Response_Header_1, ..., Response_Header_n>
指定认证请求完成后传递给后端的头信息。
• nginx.ingress.kubernetes.io/auth-proxy-set-headers
: <ConfigMap>
指定传递给认证服务的头信息的 ConfigMap 名称。
• nginx.ingress.kubernetes.io/auth-request-redirect
: <Request_Redirect_URL>
指定 X-Auth-Request-Redirect 头的值。
• nginx.ingress.kubernetes.io/auth-cache-key
: <Cache_Key>
启用认证请求的缓存。指定认证响应的查找键。例如 $remote_user$http_authorization
。每个服务器和 location 都有自己的键空间。因此,缓存的响应仅在每个服务器和 location 的基础上有效。
• nginx.ingress.kubernetes.io/auth-cache-duration
: <Cache_duration>
根据响应代码指定认证响应的缓存时间。例如 200 202 30m
。详情请参阅 proxy_cache_valid。可以指定多个逗号分隔的值:200 202 10m, 401 5m
。默认为 200 202 401 5m
。
• nginx.ingress.kubernetes.io/auth-always-set-cookie
: <Boolean_Flag>
设置认证请求返回的 Cookie。默认情况下,仅当上游报告代码为 200、201、204、206、301、302、303、304、307 或 308 时才会设置 Cookie。
• nginx.ingress.kubernetes.io/auth-snippet
: <Auth_Snippet>
指定用于外部认证的自定义片段。例如:
nginx.ingress.kubernetes.io/auth-url: http://foo.com/external-auth
nginx.ingress.kubernetes.io/auth-snippet: |
proxy_set_header Foo-Header 42;
注意:
nginx.ingress.kubernetes.io/auth-snippet
是一个可选注解。但是,它只能与nginx.ingress.kubernetes.io/auth-url
一起使用,如果未设置nginx.ingress.kubernetes.io/auth-url
,它将被忽略。
示例
请查看 external-auth 示例。
全局外部认证 (Global External Authentication)
默认情况下,如果在 Ingress NGINX ConfigMap 中设置了 global-auth-url
,控制器会将所有请求重定向到提供认证的现有服务。如果你想禁用该 Ingress 的此行为,可以使用 nginx.ingress.kubernetes.io/enable-global-auth: "false"
注解。
• nginx.ingress.kubernetes.io/enable-global-auth
: 指示是否应将 GlobalExternalAuth 配置应用于此 Ingress 规则。默认值为 "true"
。
注意
更多信息请参阅 global-auth-url。
速率限制 (Rate Limiting)
这些注解定义了连接和传输速率的限制。可用于缓解 DDoS 攻击。
注意
速率限制按 Ingress NGINX 控制器副本应用。如果你运行多个副本或使用水平 Pod 自动扩缩器(HPA),有效速率限制将乘以副本数。使用 HPA 时,随着副本数基于负载变化,确切的速率限制会变得动态。
• nginx.ingress.kubernetes.io/limit-connections
: 每个控制器副本允许来自单个 IP 地址的并发连接数。超过此限制将返回 503 错误。
• nginx.ingress.kubernetes.io/limit-rps
: 每个控制器副本每秒接受的来自给定 IP 的请求数。突发限制设置为此限制乘以突发乘数,默认乘数为 5。当客户端超过此限制时,返回 limit-req-status-code 默认值: 503。
• nginx.ingress.kubernetes.io/limit-rpm
: 每个控制器副本每分钟接受的来自给定 IP 的请求数。突发限制设置为此限制乘以突发乘数,默认乘数为 5。当客户端超过此限制时,返回 limit-req-status-code 默认值: 503。
• nginx.ingress.kubernetes.io/limit-burst-multiplier
: 限制速率的突发大小乘数。默认突发乘数为 5,此注解覆盖默认乘数。当客户端超过此限制时,返回 limit-req-status-code 默认值: 503。
• nginx.ingress.kubernetes.io/limit-rate-after
: 初始千字节数,之后对给定连接的响应传输将受到速率限制。此功能必须与 proxy-buffering 一起启用。
• nginx.ingress.kubernetes.io/limit-rate
: 允许发送到给定连接的每秒千字节数。零值禁用速率限制。此功能必须与 proxy-buffering 一起启用。
• nginx.ingress.kubernetes.io/limit-whitelist
: 排除在速率限制之外的客户端 IP 源范围。值为 CIDR 的逗号分隔列表。
如果在单个 Ingress 规则中指定多个注解,限制将按 limit-connections
、limit-rpm
、limit-rps
的顺序应用。
要为所有 Ingress 规则全局配置设置,可以在 NGINX ConfigMap 中设置 limit-rate-after
和 limit-rate
值。Ingress 注解中设置的值将覆盖全局设置。
客户端 IP 地址将基于 PROXY 协议 的使用或启用 use-forwarded-headers 时的 X-Forwarded-For
头值设置。
永久重定向 (Permanent Redirect)
此注解允许返回永久重定向(返回码 301)而不是将数据发送到上游。例如 nginx.ingress.kubernetes.io/permanent-redirect: https://www.google.com
会将所有内容重定向到 Google。
永久重定向码 (Permanent Redirect Code)
此注解允许你修改用于永久重定向的状态码。例如 nginx.ingress.kubernetes.io/permanent-redirect-code: '308'
会返回 308 的永久重定向。
临时重定向 (Temporal Redirect)
此注解允许返回临时重定向(返回码 302)而不是将数据发送到上游。例如 nginx.ingress.kubernetes.io/temporal-redirect: https://www.google.com
会将所有内容重定向到 Google,返回码为 302(临时移动)。
临时重定向码 (Temporal Redirect Code)
此注解允许你修改用于临时重定向的状态码。例如 nginx.ingress.kubernetes.io/temporal-redirect-code: '307'
会返回 307 的临时重定向。
SSL 透传 (SSL Passthrough)
注解 nginx.ingress.kubernetes.io/ssl-passthrough
指示控制器将 TLS 连接直接发送到后端,而不是让 NGINX 解密通信。另请参阅用户指南中的 TLS/HTTPS。
注意
默认情况下禁用 SSL 透传,需要启动控制器时使用 --enable-ssl-passthrough
标志。
注意
由于 SSL 透传工作在 OSI 模型的第 4 层(TCP)而不是第 7 层(HTTP),使用 SSL 透传会使 Ingress 对象上设置的所有其他注解无效。
服务上游 (Service Upstream)
默认情况下,Ingress-Nginx 控制器在 NGINX 上游配置中使用所有端点(Pod IP/端口)的列表。
nginx.ingress.kubernetes.io/service-upstream
注解禁用该行为,改为在 NGINX 中使用单个上游,即服务的 Cluster IP 和端口。
这对于零停机部署等场景非常有用。参见问题 #257。
已知问题
如果指定了 service-upstream
注解,应考虑以下事项:
• 粘性会话将不起作用,因为仅支持轮询负载均衡。
• proxy_next_upstream
指令将不起作用,意味着在错误时请求不会分派到另一个上游。
服务器端 HTTPS 强制重定向 (Server-side HTTPS Enforcement Through Redirect)
默认情况下,如果为该 Ingress 启用了 TLS,控制器会重定向(308)到 HTTPS。如果你想全局禁用此行为,可以在 NGINX ConfigMap 中使用 ssl-redirect: "false"
。
要为特定的 Ingress 资源配置此功能,可以在特定资源中使用 nginx.ingress.kubernetes.io/ssl-redirect: "false"
注解。
在集群外使用 SSL 卸载(例如 AWS ELB)时,即使没有可用的 TLS 证书,也可能需要强制重定向到 HTTPS。可以通过在特定资源中使用 nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
注解实现。
要在 ssl-redirect
中保留 URI 的尾部斜杠,可以为该特定资源设置 nginx.ingress.kubernetes.io/preserve-trailing-slash: "true"
注解。
从/到 www 重定向 (Redirect From/To www)
在某些场景中,需要从 www.domain.com
重定向到 domain.com
或反之亦然,重定向的方式取决于 Ingress 对象中配置的 host
值。
例如,如果 .spec.rules.host
配置为类似 www.example.com
的值,则此注解将从 example.com
重定向到 www.example.com
。如果 .spec.rules.host
配置为类似 example.com
的值(即不带 www
),则此注解将从 www.example.com
重定向到 example.com
。
要启用此功能,使用注解 nginx.ingress.kubernetes.io/from-to-www-redirect: "true"
注意
如果某个时候创建了一个主机等于其中一个选项(如 domain.com
)的新 Ingress,该注解将被忽略。
注意
对于 HTTPS 到 HTTPS 的重定向,TLS 部分中位于 Ingress 的 Secret 中定义的 SSL 证书必须在证书的通用名中包含两个 FQDN。
拒绝列表源范围 (Denylist Source Range)
你可以通过 nginx.ingress.kubernetes.io/denylist-source-range
注解指定被阻止的客户端 IP 源范围。值为 CIDR 的逗号分隔列表,例如 10.0.0.0/24,172.10.0.1
。
要为所有 Ingress 规则全局配置此设置,可以在 NGINX ConfigMap 中设置 denylist-source-range
值。
注意
向 Ingress 规则添加注解会覆盖任何全局限制。
允许列表源范围 (Whitelist Source Range)
你可以通过 nginx.ingress.kubernetes.io/whitelist-source-range
注解指定允许的客户端 IP 源范围。值为 CIDR 的逗号分隔列表,例如 `10.0.0.0/