TL;DR
在我的实验室中挖掘并测试了相同的场景后,我找到了如何让它发挥作用。
如您所见here 参数ssl-session-cache 需要一个boolean 值来指定是否启用它。
您需要的更改由参数ssl_session_cache_size 处理并需要一个字符串,然后假设它将值更改为builtin:3000 shared:SSL:100m 是正确的,但是在复制并深入研究 nginx 配置之后,我已经得出结论它不会起作用,因为选项 builtin:1000 是硬编码。
为了使其按预期工作,我找到了一个解决方案,使用 nginx 模板作为 configMap 作为卷安装到 nginx-controller pod 和其他 configMap 以更改参数 ssl_session_cache_size .
解决方法
查看 nginx-ingress-controller pod 中文件 /etc/nginx/template 中的 343 行:
bash-5.0$ grep -n 'builtin:' nginx.tmpl
343: ssl_session_cache builtin:1000 shared:SSL:{{ $cfg.SSLSessionCacheSize }};
如您所见,builtin:1000 选项是硬编码,无法使用您方法上的自定义数据进行更改。
但是,有一些方法可以使它工作,您可以直接将模板文件更改为 pod,但如果 pod 由于某种原因死亡,这些更改将丢失......或者您可以使用自定义模板作为 configMap 安装到 nginx-controller pod 中。
在这种情况下,让我们创建一个configMap,其 nginx.tmpl 内容将第 343 行的值更改为所需的值。
- 从 nginx-ingress-controller pod 中获取模板文件,它将在本地创建一个名为
nginx.tmpl 的文件:
注意:确保命名空间正确。
$ NGINX_POD=$(kubectl get pods -n ingress-nginx -l=app.kubernetes.io/component=controller -ojsonpath='{.items[].metadata.name}')
$ kubectl exec $NGINX_POD -n ingress-nginx -- cat template/nginx.tmpl > nginx.tmpl
- 将第343行的值从
builtin:1000改为builtin:3000:
$ sed -i '343s/builtin:1000/builtin:3000/' nginx.tmpl
检查是否一切正常:
$ grep builtin nginx.tmpl
ssl_session_cache builtin:3000 shared:SSL:{{ $cfg.SSLSessionCacheSize }};
好的,此时我们有一个 nginx.tmpl 文件,其中更改了所需的参数。
让我们继续并使用自定义 nginx.tmpl 文件创建一个configMap:
$ kubectl create cm nginx.tmpl --from-file=nginx.tmpl
configmap/nginx.tmpl created
这将在ingress-nginx 命名空间中创建一个名为nginx.tmpl 的configMap,如果您的入口的命名空间不同,请在应用前进行适当的更改。
之后,我们需要编辑 nginx-ingress 部署并将新的volume 和volumeMount 添加到容器规范中。就我而言,ingress-nginx 命名空间中的 nginx-ingress 部署名称 ingress-nginx-controller。
编辑部署文件:
$ kubectl edit deployment -n ingress-nginx ingress-nginx-controller
并在正确的地方添加如下配置:
...
volumeMounts:
- mountPath: /etc/nginx/template
name: nginx-template-volume
readOnly: true
...
volumes:
- name: nginx-template-volume
configMap:
name: nginx.tmpl
items:
- key: nginx.tmpl
path: nginx.tmpl
...
保存文件后,将重新创建 nginx 控制器 pod,并将 configMap 作为文件挂载到 pod 中。
让我们检查更改是否已传播:
$ kubectl exec -n ingress-nginx $NGINX_POD -- cat nginx.conf | grep -n ssl_session_cache
223: ssl_session_cache builtin:3000 shared:SSL:10m;
太好了,第一部分完成了!
现在,对于shared:SSL:10m,我们可以使用您已经使用过的相同方法:configMap,并使用此doc 中提到的特定参数。
如果你记得在 nginx.tmpl 中,对于 shared:SSL 有一个名为 SSLSessionCache 的变量({{ $cfg.SSLSessionCacheSize }}),在 source code 中可以检查该变量是否表示为选项ssl-session-cache-size:
340 // Size of the SSL shared cache between all worker processes.
341 // http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_cache
342 SSLSessionCacheSize string `json:"ssl-session-cache-size,omitempty"`
所以,我们需要做的就是使用此参数和所需值创建一个configMap:
kind: ConfigMap
apiVersion: v1
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
data:
ssl-session-cache-size: "100m"
注意:根据您的环境调整命名空间和 configMap 名称。
应用此configMapNGINX 将重新加载配置并在配置文件中进行更改。
检查结果:
$ NGINX_POD=$(kubectl get pods -n ingress-nginx -l=app.kubernetes.io/component=controller -ojsonpath='{.items[].metadata.name}')
$ kubectl exec -n ingress-nginx $NGINX_POD -- cat nginx.conf | grep -n ssl_session_cache
223: ssl_session_cache builtin:3000 shared:SSL:100m;
结论
它会按预期工作,不幸的是,我找不到在builtin: 中添加变量的方法,所以我们将继续使用它硬编码,但此时它将是一个configMap,您可以在需要时轻松进行更改。
参考资料:
NGINX INgress Custom template
NGINX Ingress Source Code