K8S 中使用 ingress-nginx,为我们提供了很大的方便,我们不需要自己手工维护 nginx,只需要配置相应的 ingress 规则,就可以直接生效到 nginx-controller 中。

但是凡事都是相对了,简单的另一面就是灵活性降低,我们不再能像维护自己安装的nginx 一样随心所欲的修改配置文件。比如在有些时候我们需要在 server 里或者 location 里添加一些参数,例如添加包体大小限制、添加跨域配置、添加自定义header、处理响应header等等。遇到这些需求的时候,我们开始怀念原生的 nginx 配置,因为那样我们可以随心所欲的修改。

我们有这样的需求,官方在做这个的时候,也做了一些考虑,为了我们提供了一些配置切入点,我们可以通过配置 annotation,按照官方提供的一些规则来将我们的一些自定义配置插入进去。

本文列出两种切入点示例:

  • nginx.ingress.kubernetes.io/configuration-snippet (用于插入 location 块代码段)
  • nginx.ingress.kubernetes.io/server-snippet (用于插入 server 块中的代码段)

1、更多关于 nginx.ingress.kubernetes.io 的使用,详见文章底部的官方文档。
2、要注意官方文档中开篇的一句话:!!! note The annotation prefix can be changed using the --annotations-prefix command line argument, but the default is nginx.ingress.kubernetes.io, as described in the table below.

使用示例:

kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |-
      add_header Shy-Test 888;
      more_set_headers 'Shy-Hello: hello' 'Demo: demo';
  labels:
    cattle.io/creator: norman
  name: website-muses-docs
  namespace: muses-docs
  
  // 省略更多配置
  

如上示例就是在 nginx 的 server 块中添加两行代码。
add_header Shy-Test 888; 就是给响应头添加一个header。
more_set_headers 'Shy-Test: 666' 'Demo: demo'; 也是给响应头设置多个 header,与 add_header 不同的是,这个会覆盖,add 是追加。nginx-ingress-controller 已经为我们内置了 ngx_headers_more 模块,这是一个可以更灵活操作 header 的 module。
nginx.ingress.kubernetes.io/configuration-snippet 的使用方法和 server 的一样。

想了解更多 annotation 配置,详见官方文档:
https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/


(END)