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 以供参考
1apiVersion: v1
2data:
3 compute-full-forwarded-for: 'true'
4 forwarded-for-header: X-Forwarded-For
5 use-forwarded-headers: 'true'
6 keep-alive-requests: '10000'
7 log-format-upstream: >-
8 {"time": "$time_iso8601", "remote_addr": "$proxy_protocol_addr",
9 "x_forward_for": "$proxy_add_x_forwarded_for", "request_id": "$req_id",
10 "remote_user": "$remote_user", "bytes_sent": $bytes_sent, "request_time":
11 $request_time, "status": $status, "vhost": "$host", "request_proto":
12 "$server_protocol", "path": "$uri", "request_query": "$args",
13 "request_length": $request_length, "duration": $request_time,"method":
14 "$request_method", "http_referrer": "$http_referer", "http_user_agent":
15 "$http_user_agent" }
16 max-worker-connections: '65536'
17 upstream-keepalive-connections: '200'
18kind: ConfigMap
19metadata:
20 annotations:
21 meta.helm.sh/release-name: cce-ngx-control
22 meta.helm.sh/release-namespace: kube-system
23 labels:
24 app.kubernetes.io/component: controller
25 app.kubernetes.io/instance: cce-ngx-control
26 app.kubernetes.io/managed-by: Helm
27 app.kubernetes.io/name: cce-ingress-nginx-controller
28 app.kubernetes.io/version: 0.45.0
29 helm.sh/chart: cce-ingress-nginx-controller-3.29.0
30 name: cce-ngx-control-controller
31 namespace: kube-system
NGINX Ingress Annotation
NGINX Ingress 中的 Annotation 中的配置可以对 Ingress、Host 或是某条 Rule 的默认行为进行修改。
完整的 Ingress Annotation 配置请参考 Annotations - NGINX Ingress Controller
示例
以下是一个集群中的 Ingress 资源内容以供参考:
1apiVersion: networking.k8s.io/v1
2kind: Ingress
3metadata:
4 annotations:
5 cce.ingress.blb-backup-content: ''
6 kubernetes.io/ingress.class: cce
7 nginx.ingress.kubernetes.io/use-regex: 'true'
8 nginx.ingress.kubernetes.io/ssl-redirect: 'false'
9 name: test
10 namespace: default
11spec:
12 rules:
13 - host: a.com
14 http:
15 paths:
16 - backend:
17 service:
18 name: service-example
19 port:
20 number: 80
21 path: /*
常见使用场景
以下说明常用的使用场景及其相关配置
使用 X-Forwarded-For Header 记录源 IP
当我们希望请求经过 Ingress 的时候,附加上请求的原始 ClientIP 时,可以按以下配置进行修改:
1# 配置位于 ConfigMap
2compute-full-forwarded-for: 'true' # 计算完整 X-Forwarded-For Header,将源 IP 添加在 Header 之后,而非直接覆盖原值
3forwarded-for-header: X-Forwarded-For # 使用 X-Forwarded-For Header 来标识源 IP
4use-forwarded-headers: 'true' # 沿用上游请求的 X-Forwarded-* 相关 Header
Ingress 同时接收 HTTP 与 HTTPS 请求
NGINX Ingress 默认对配置 HTTPS 的域名的 HTTP 请求返回 308 响应,为 Ingress 资源以下 Annotation 之后 HTTPS 跳转会关闭,HTTP 可以直接访问:
1# 配置位于 Ingress Annotation
2nginx.ingress.kubernetes.io/ssl-redirect: "false" # 关闭 SSL 重定向
URL 重写
Ingress 结合 Annotation 可以实现 URL 重写。
在正则匹配提取时,$N 代表匹配 URL 正则表达式模板中的第 N 个括号中匹配到的内容。
以下举例,假设我们希望将某个 Ingress 下的 ^/nginx/(.) URL 向后端服务转发时去除 /nginx 前缀,将某个 Ingress 下的 ^/tomcat/(.) URL 向后端服务转发时去除 /tomcat 前缀,那么可以在 Ingress 中添加如下 Annotation:
1# 配置位于 Ingress Annotation
2nginx.ingress.kubernetes.io/configuration-snippet: |
3 rewrite ^/nginx/(.*) /$1 break;
4 rewrite ^/tomcat/(.*) /$1 break;