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)