nginx.conf 忽略了 nginx-ingress 配置映射片段
nginx-ingress config map snippets being ignored by the nginx.conf
我有一个 kubernetes 集群,我在其中使用 helm nginx-ingress chart 部署了一个 nginx 入口控制器。
我需要向 nginx-controller-pod 中生成的 nginx.conf 文件添加一些自定义配置,我看到一个问题,如果我添加一行选项,例如 proxy-buffer-size: "512k"
我可以看到这反映在 nginx.conf 文件中,一切都按预期工作。
但是,如果我尝试添加一个片段来完成同样的事情:
location-snippet: |
proxy_buffer_size "512k";
好像这被 nginx.conf 文件忽略了,proxy_buffer_size
设置保持默认值。
我需要能够添加 http-snippet
、server-snippet
和 location-snippet
覆盖,但我是否尝试将它们添加到 ConfigMap 或作为 [=37= 中的注释] 文件,它们总是被忽略。
我的 Ingress yaml 文件:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: nginx
ingress.kubernetes.io/ssl-redirect: "true"
ingress.kubernetes.io/secure-backends: "true"
ingress.kubernetes.io/force-ssl-redirect: "true"
ingress.kubernetes.io/location-snippet: |
proxy_buffer_size 512k; --This does not update the nginx.conf
spec:
tls:
- hosts:
- my.app.co.uk
secretName: tls-secret
rules:
- host: my.app.co.uk
http:
paths:
- path: /
backend:
serviceName: myappweb-service
servicePort: 80
我的 nginx 配置图:
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app: nginx-ingress
chart: nginx-ingress-0.28.3
component: controller
heritage: Tiller
release: nginx-ingress
name: nginx-ingress-controller
namespace: default
data:
proxy-buffer-size: "512k" -- this works and updates the nginx.conf
location-snippet: |
proxy_buffers 4 512k; -- this does not update the nginx.conf
server-snippet: | -- this does not update the nginx.conf
location /messagehub {
proxy_set_header Upgrade $http_upgrade;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_set_header Connection "upgrade";
proxy_cache_bypass $http_upgrade;
}
如果您想修改 Kubernetes Ingress
,注释选项如下:
nginx.ingress.kubernetes.io/configuration-snippet
用于 nginx 位置块片段
nginx.ingress.kubernetes.io/server-snippet
nginx 配置服务块中的片段
看起来你正在为这种情况使用 nginx.org/location-snippets:
。
在 nginx 配置示例中还有一个 YAML 无效语法,您还应该根据此 server-snippets
使用复数 example. There's a typo in the docs as of this writing. Opened this ticket 跟进。
应该是这样的:
server-snippets: |
location /messagehub {
proxy_set_header Upgrade $http_upgrade;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_set_header Connection "upgrade";
proxy_cache_bypass $http_upgrade;
}
而不是这个:
server-snippet: |
location /messagehub {
proxy_set_header Upgrade $http_upgrade;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_set_header Connection "upgrade";
proxy_cache_bypass $http_upgrade;
}
注意最后一个大括号的缩进。
事实证明,我的问题是由于我所应用的代码段的内容引起的。每次您 运行 kubectl apply -f myconfigmap.yaml
,验证都是 运行 针对您尝试应用到 nginx.conf 的更改。当此验证失败时,它会静静地失败,并且在终端中没有任何提醒您这一点。
实际上,您仍然会收到 configmap/nginx-ingress-controller configured
消息。
例如,当我将其添加到配置映射时,它会按预期更新 nginx.conf:
http-snippet: |
sendfile on;
但是,当我添加这个时,没有任何变化:
http-snippet: |
sendfile on;
tcp_nopush on;
原因是验证失败,但唯一的方法是查看 nginx 入口控制器 pod 的日志。在这种情况下,我看到:
Error: exit status 1
2018/10/16 07:45:49 [emerg] 470#470: "tcp_nopush" directive is duplicate in
/tmp/nginx-cfg468835321:245
nginx: [emerg] "tcp_nopush" directive is duplicate in /tmp/nginx-cfg468835321:245
nginx: configuration file /tmp/nginx-cfg468835321 test failed
所以我复制了一个已经存在的指令。
我花了一天时间才得到 ingress-nginx(来自 Kubernetes)有 *-snippet
,但是 nginx-ingress(来自 NGINX)*-snippets
和 s.
看这里:
如果有人需要 Kubernetes 1.23 和 Helm 3 的解决方案, 在类似的主题中。
我有一个 kubernetes 集群,我在其中使用 helm nginx-ingress chart 部署了一个 nginx 入口控制器。
我需要向 nginx-controller-pod 中生成的 nginx.conf 文件添加一些自定义配置,我看到一个问题,如果我添加一行选项,例如 proxy-buffer-size: "512k"
我可以看到这反映在 nginx.conf 文件中,一切都按预期工作。
但是,如果我尝试添加一个片段来完成同样的事情:
location-snippet: |
proxy_buffer_size "512k";
好像这被 nginx.conf 文件忽略了,proxy_buffer_size
设置保持默认值。
我需要能够添加 http-snippet
、server-snippet
和 location-snippet
覆盖,但我是否尝试将它们添加到 ConfigMap 或作为 [=37= 中的注释] 文件,它们总是被忽略。
我的 Ingress yaml 文件:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: nginx
ingress.kubernetes.io/ssl-redirect: "true"
ingress.kubernetes.io/secure-backends: "true"
ingress.kubernetes.io/force-ssl-redirect: "true"
ingress.kubernetes.io/location-snippet: |
proxy_buffer_size 512k; --This does not update the nginx.conf
spec:
tls:
- hosts:
- my.app.co.uk
secretName: tls-secret
rules:
- host: my.app.co.uk
http:
paths:
- path: /
backend:
serviceName: myappweb-service
servicePort: 80
我的 nginx 配置图:
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app: nginx-ingress
chart: nginx-ingress-0.28.3
component: controller
heritage: Tiller
release: nginx-ingress
name: nginx-ingress-controller
namespace: default
data:
proxy-buffer-size: "512k" -- this works and updates the nginx.conf
location-snippet: |
proxy_buffers 4 512k; -- this does not update the nginx.conf
server-snippet: | -- this does not update the nginx.conf
location /messagehub {
proxy_set_header Upgrade $http_upgrade;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_set_header Connection "upgrade";
proxy_cache_bypass $http_upgrade;
}
如果您想修改 Kubernetes Ingress
,注释选项如下:
nginx.ingress.kubernetes.io/configuration-snippet
用于 nginx 位置块片段nginx.ingress.kubernetes.io/server-snippet
nginx 配置服务块中的片段
看起来你正在为这种情况使用 nginx.org/location-snippets:
。
在 nginx 配置示例中还有一个 YAML 无效语法,您还应该根据此 server-snippets
使用复数 example. There's a typo in the docs as of this writing. Opened this ticket 跟进。
应该是这样的:
server-snippets: |
location /messagehub {
proxy_set_header Upgrade $http_upgrade;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_set_header Connection "upgrade";
proxy_cache_bypass $http_upgrade;
}
而不是这个:
server-snippet: |
location /messagehub {
proxy_set_header Upgrade $http_upgrade;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_set_header Connection "upgrade";
proxy_cache_bypass $http_upgrade;
}
注意最后一个大括号的缩进。
事实证明,我的问题是由于我所应用的代码段的内容引起的。每次您 运行 kubectl apply -f myconfigmap.yaml
,验证都是 运行 针对您尝试应用到 nginx.conf 的更改。当此验证失败时,它会静静地失败,并且在终端中没有任何提醒您这一点。
实际上,您仍然会收到 configmap/nginx-ingress-controller configured
消息。
例如,当我将其添加到配置映射时,它会按预期更新 nginx.conf:
http-snippet: |
sendfile on;
但是,当我添加这个时,没有任何变化:
http-snippet: |
sendfile on;
tcp_nopush on;
原因是验证失败,但唯一的方法是查看 nginx 入口控制器 pod 的日志。在这种情况下,我看到:
Error: exit status 1
2018/10/16 07:45:49 [emerg] 470#470: "tcp_nopush" directive is duplicate in
/tmp/nginx-cfg468835321:245
nginx: [emerg] "tcp_nopush" directive is duplicate in /tmp/nginx-cfg468835321:245
nginx: configuration file /tmp/nginx-cfg468835321 test failed
所以我复制了一个已经存在的指令。
我花了一天时间才得到 ingress-nginx(来自 Kubernetes)有 *-snippet
,但是 nginx-ingress(来自 NGINX)*-snippets
和 s.
看这里:
如果有人需要 Kubernetes 1.23 和 Helm 3 的解决方案,