NGINX Ingress 使用配置参考
对于 cce-ingress-nginx-controller 组件有 2 处位置可以对组件参数或 Ingress 资源进行配置。
我们可以在组件的 ConfigMap 配置组件的全局运行参数,或是在 Ingress Annotation 中对某个 Ingress 或是 Host、Rule 的配置进行修改。
Ingress NGINX Controller ConfigMap
在集群中的每个 cce-ingress-nginx-controller 插件实例均配有对应的 ConfigMap,其配置项作用于所属插件整体。
组件会使用 ConfigMap 中的配置来覆盖组件的默认配置。
在集群中,该 ConfigMap 存在于 kube-system 命名空间并以 {ingressclass}-ngx-control-controller 命名。
ConfigMap 中配置项的内容均为 key-values 字符串:
- 对于数字和 Bool 类型 Value,需要对其添加引号,如:"true","101"
- 对于数组 Value,使用逗号分隔的字符串
完整 ConfigMap 参数请参考 ConfigMap - NGINX Ingress Controller
示例
以下是一个集群中 cce-ingress-nginx-controller ConfigMap 以供参考
apiVersion: v1
data:
compute-full-forwarded-for: 'true'
forwarded-for-header: X-Forwarded-For
use-forwarded-headers: 'true'
keep-alive-requests: '10000'
log-format-upstream: >-
{"time": "$time_iso8601", "remote_addr": "$proxy_protocol_addr",
"x_forward_for": "$proxy_add_x_forwarded_for", "request_id": "$req_id",
"remote_user": "$remote_user", "bytes_sent": $bytes_sent, "request_time":
$request_time, "status": $status, "vhost": "$host", "request_proto":
"$server_protocol", "path": "$uri", "request_query": "$args",
"request_length": $request_length, "duration": $request_time,"method":
"$request_method", "http_referrer": "$http_referer", "http_user_agent":
"$http_user_agent" }
max-worker-connections: '65536'
upstream-keepalive-connections: '200'
kind: ConfigMap
metadata:
annotations:
meta.helm.sh/release-name: cce-ngx-control
meta.helm.sh/release-namespace: kube-system
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: cce-ngx-control
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: cce-ingress-nginx-controller
app.kubernetes.io/version: 0.45.0
helm.sh/chart: cce-ingress-nginx-controller-3.29.0
name: cce-ngx-control-controller
namespace: kube-system
NGINX Ingress Annotation
NGINX Ingress 中的 Annotation 中的配置可以对 Ingress、Host 或是某条 Rule 的默认行为进行修改。
完整的 Ingress Annotation 配置请参考 Annotations - NGINX Ingress Controller
示例
以下是一个集群中的 Ingress 资源内容以供参考:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cce.ingress.blb-backup-content: ''
kubernetes.io/ingress.class: cce
nginx.ingress.kubernetes.io/use-regex: 'true'
nginx.ingress.kubernetes.io/ssl-redirect: 'false'
name: test
namespace: default
spec:
rules:
- host: a.com
http:
paths:
- backend:
service:
name: service-example
port:
number: 80
path: /*
常见使用场景
以下说明常用的使用场景及其相关配置
使用 X-Forwarded-For Header 记录源 IP
当我们希望请求经过 Ingress 的时候,附加上请求的原始 ClientIP 时,可以按以下配置进行修改:
# 配置位于 ConfigMap
compute-full-forwarded-for: 'true' # 计算完整 X-Forwarded-For Header,将源 IP 添加在 Header 之后,而非直接覆盖原值
forwarded-for-header: X-Forwarded-For # 使用 X-Forwarded-For Header 来标识源 IP
use-forwarded-headers: 'true' # 沿用上游请求的 X-Forwarded-* 相关 Header
Ingress 同时接收 HTTP 与 HTTPS 请求
NGINX Ingress 默认对配置 HTTPS 的域名的 HTTP 请求返回 308 响应,为 Ingress 资源以下 Annotation 之后 HTTPS 跳转会关闭,HTTP 可以直接访问:
# 配置位于 Ingress Annotation
nginx.ingress.kubernetes.io/ssl-redirect: "false" # 关闭 SSL 重定向
URL 重写
Ingress 结合 Annotation 可以实现 URL 重写。
在正则匹配提取时,$N 代表匹配 URL 正则表达式模板中的第 N 个括号中匹配到的内容。
以下举例,假设我们希望将某个 Ingress 下的 ^/nginx/(.) URL 向后端服务转发时去除 /nginx 前缀,将某个 Ingress 下的 ^/tomcat/(.) URL 向后端服务转发时去除 /tomcat 前缀,那么可以在 Ingress 中添加如下 Annotation:
# 配置位于 Ingress Annotation
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite ^/nginx/(.*) /$1 break;
rewrite ^/tomcat/(.*) /$1 break;