【问题标题】:How to set the ssl-session-cache values in configmap - kubernetes?如何在 configmap - kubernetes 中设置 ssl-session-cache 值?
【发布时间】:2020-04-17 13:23:58
【问题描述】:

我尝试在我的配置映射中为 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" 语法错误 - 无法更改配置映射

ssl-session-cache builtin:"3000 shared:SSL:100m" 语法错误 - 无法更改配置映射

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

谢谢!

【问题讨论】:

  • 您能在问题中发布您的configMap 吗?另外,您是否使用 helm 安装 ingress-nginx?

标签: kubernetes kubernetes-ingress nginx-ingress configmap


【解决方案1】:

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 行的值更改为所需的值。

  1. 从 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
  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"

注意:根据您的环境调整命名空间和 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-02
    • 2018-12-18
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 2020-11-11
    • 2017-11-07
    相关资源
    最近更新 更多