如何在configmap-kubernetes中设置ssl-session-cache值?

时间:2020-04-17 13:23:58

标签: kubernetes kubernetes-ingress nginx-ingress configmap

我尝试在configmap中为ingress-controller设置ssl-session-cache的值,

问题是,我找不到正确的书写方式。

我需要对nginx配置进行以下更改:

ssl-session-cache builtin:3000 shared:SSL:100m

ssl-session-timeout: 3000

当我添加 ssl-session-timeout: "3000"到配置映射,它可以正常工作-几秒钟后,我可以在nginx-config中看到这一点。

但是我应该怎么写ssl-session-cache?

ssl-session-cache: builtin:"3000" shared:SSL:"100m"进行得很好,但是nginx没有任何变化

ssl-session-cache: "builtin:3000 shared:SSL:100m"进行得很好,但是nginx没有任何变化

ssl-session-cache "builtin:3000 shared:SSL:100m"语法错误-无法更改configmap

ssl-session-cache builtin:"3000 shared:SSL:100m"语法错误-无法更改configmap

有人知道如何在configmap中正确设置ssl-session-cache吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

TL; DR

在我的实验室中进行挖掘并测试了相同的场景之后,我发现了如何使其工作。

如您所见here,参数ssl-session-cache需要一个布尔值值来指定是否将其启用。

您所需的更改由参数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窗格中的文件/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中。

在这种情况下,我们用nginx.tmpl内容创建一个configMap,将第343行的值更改为所需的值。

  1. 从nginx-ingress-controller容器中获取模板文件,它将在本地创建一个名为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
  1. 将第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

这将在configMap命名空间中创建一个称为nginx.tmpl的{​​{1}},如果您的入口的命名空间不同,请在应用之前进行适当的更改。

此后,我们需要编辑nginx-ingress部署,并在容器规范中添加新的ingress-nginxvolume。就我而言,是volumeMount命名空间中的nginx-ingress部署名称ingress-nginx-controller

编辑部署文件:

ingress-nginx

并在正确的位置添加以下配置:

$ kubectl edit deployment -n ingress-nginx ingress-nginx-controller

保存文件后,将重新创建nginx控制器容器,并将... 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 ... 作为文件安装到容器中。

让我们检查一下更改是否已传播:

configMap

太好了,第一部分完成了!

对于$ 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,具有本doc中提到的特定参数。

如果您还记得在nginx.tmpl中,对于configMap,有一个名为 SSLSessionCache shared:SSL)的变量,可以在source code中进行检查该变量由选项{{ $cfg.SSLSessionCacheSize }}表示:

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

注意:调整名称空间和configMap名称,使其与您的环境等效。

应用此kind: ConfigMap apiVersion: v1 metadata: name: ingress-nginx-controller namespace: ingress-nginx data: ssl-session-cache-size: "100m" NGINX将重新加载配置并在配置文件中进行更改。

检查结果:

configMap

结论

它可以按预期工作,很遗憾,我找不到在$ 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; 中添加变量的方法,因此我们将继续使用经过 hardcoded 的方法,但此时它将是一个configMap,可以根据需要轻松进行更改。

参考文献:

NGINX INgress Custom template

NGINX Ingress Source Code