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

How to set the ssl-session-cache values in configmap - kubernetes?

我尝试在入口控制器的配置映射中设置 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?

谢谢!

TL;DR

在我的实验室中深入研究并测试相同的场景后,我找到了如何让它发挥作用。

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

您需要的更改由参数 ssl_session_cache_size 处理并且需要一个字符串,然后假设它可以将值更改为 builtin:3000 shared:SSL:100m 是正确的,但是在复制并深入到 nginx 之后配置,我得出的结论是它不会工作,因为选项 builtin:1000hardcoded.

为了让它按预期工作,我找到了一个解决方案,使用 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 行的值以获得所需的值。

  1. 从 nginx-ingress-controller pod 获取模板文件,它会在本地创建一个名为nginx.tmpl的文件:

NOTE: Make sure the namespace is correct.

$ 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

这将在 ingress-nginx 命名空间中创建一个名为 nginx.tmplconfigMap,如果您的入口命名空间不同,请在应用前进行适当的更改。

之后,我们需要编辑 nginx-ingress 部署并向容器规范添加新的 volumevolumeMount。在我的例子中,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"

Note: Adjust the namespace and configMap name for the equivalent of your environment.

应用此 configMap NGINX 将重新加载配置并在配置文件中进行更改。

检查结果:

$ 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: 中添加变量的方法,所以我们将继续使用它 hardcoded 但是此时它将是一个 configMap,您可以根据需要轻松进行更改。

参考文献:

NGINX INgress Custom template

NGINX Ingress Source Code