【TKE】Ingress-nginx 组件添加和设置 header

2023-09-14 17:40:42 浏览数 (1)

操作背景

在实际业务转发场景中,经常会有添加或更新 http header 的需求,比如在请求头中加入 token 密钥以方便接口校验(请求上游时设置)或设置允许跨域请求头(响应客户端时添加)等需求,示例配置如下:

代码语言:javascript复制
location /v3/segments {
    proxy_set_header authentication BaFdLUhcs*********YhY;
    add_header Access-Control-Allow-Headers 'sw8';
    proxy_pass https://ap-guangzhou.apm.tencentcs.com:12800/v3/segments;
}

上述配置在 Ingress-nginx 可以通过 snippets注解 的方式配置,但为了安全起见,默认情况下,snippets注解

不允许的, 参考: allow-snippet-annotations 。另外,这种方式只能给具体的 ingress 资源配置,如果需要给所有ingress 接口配置就很麻烦, 维护起来很不优雅.

所以推荐通过官方提供的 自定义Header 的方式来配置,下面将介绍如何配置。

操作作步骤

下面以 TKE Ingress-nginx 组件实例在 kube-system (监听所有命名空间)为例,如果是指定命名空间生效需要对应修改 configmap的命名空间。

1. 转发请求到上游时设置(proxy_set_header)

在 "set-headers"configmap中配置要设置的 headers ,如下图:

代码语言:yaml复制
apiVersion: v1
data:
  ...
  authentication: "BaFdLUhcs*********YhY"
  ...
kind: ConfigMap
metadata:
  name: set-headers # configmap 名
  namespace: kube-system

2.响应客户端时添加 header(add_header)

在 "add-headers"configmap中配置要添加的 headers ,如下图:

代码语言:yaml复制
apiVersion: v1
data:
  ...
  Access-Control-Allow-Headers: 'sw8'
  ...
kind: ConfigMap
metadata:
  name: add-headers # configmap 名
  namespace: kube-system

3. 将上述配置关联生效

将上述配置应用到集群中后,在 "<实例名>-ingress-nginx-controller"configmap中配置引用生效,如下图:

代码语言:yaml复制
apiVersion: v1
data:
  ...
  proxy-set-headers: "kube-system/set-headers" # 按需引用自定义set headers 的configmap
  add-headers: "kube-system/add-headers" # 按需引用自定义添加 headers 的configmap
  ...
kind: ConfigMap
metadata:
  name: <实例名>-ingress-nginx-controller
  namespace: kube-system
  labels:
    k8s-app: <实例名>-ingress-nginx-controller
    qcloud-app: <实例名>-ingress-nginx-controller

应用配置后验证配置是否已经正常加载,登录 nginx controller 容器中查看配置:

代码语言:javascript复制
cat /etc/nginx/nginx.conf | less

通过查找可以看到相关配置已生效,如下图:

proxy-set-headerproxy-set-header
add-headeradd-header

0 人点赞