在 configmap 更改时触发 pod 重新启动

Geo*_*rge 1 kubernetes-helm configmap

我有一个定义如下的 configmap 文件

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-dashboard-cm-conf
  namespace: {{ .Release.Namespace }}
data:
{{ (tpl (.Files.Glob "conf/*").AsConfig . ) | indent 2 }}
Run Code Online (Sandbox Code Playgroud)

正如您在上面看到的,它占用了“conf”文件夹的内容作为数据。一切正常,但是当我尝试使用“部署文件中的以下行”实施“注释”以触发“POD 重新启动”时,会观察到问题。

      annotations:
        checksum/config-map: {{ include (print .Template.BasePath "/dashboard-conf-map.yaml") . | sha256sum }}

Run Code Online (Sandbox Code Playgroud)

即使“conf”文件夹的内容发生更改并且执行“helm 升级”,POD 也不会重新启动。

如果我使用一个简单的配置映射,其数据定义如下,参数的更改和“helm 升级”确实会导致 POD 重新启动

data:
  parameter1: testparam1
  parameter2: testparam2
Run Code Online (Sandbox Code Playgroud)

我在这里有以下问题

  1. 有没有办法对文件夹执行校验和。

  2. 有没有办法在 configmap.txt 中获取像下面这样的 linux-command 的输出?

find dashboard/conf/ -type f -exec md5sum {} \; |md5sum

  1. 我们可以对非 YAML 文件执行校验和吗?
      annotations:
        checksum: {{ include (print .Template.BasePath "/logback-spring.xml") . | sha256sum }}

Run Code Online (Sandbox Code Playgroud)

我收到以下错误错误:chart-2/charts/dashboar/templates/conf1/logback-spring.xml 上的 YAML 解析错误:解组 JSON 时出错:解码 JSON:json:无法将字符串解组为 releaseutil.SimpleHead 类型的 Go 值

  1. 我们可以对“.Template.BasePath”上方的文件一级目录执行校验和吗?我尝试了下面的组合,所有这些都会导致错误。
checksum/config: {{ include (print .BasePath "../conf/values1.yaml") . | sha256sum }}

checksum/config: {{ include (print .Template.BasePath "/../../conf/values1.yaml") . | sha256sum }}

checksum/config: {{ include (print .Template.BasePath "/../conf/values1.yaml") . | sha256sum }} 
Run Code Online (Sandbox Code Playgroud)

错误调用包括:模板:没有与模板“gotpl”关联的模板“chart-2/charts/dashboard/templates../conf/values1.yaml”

错误调用包括:模板:没有与模板“gotpl”关联的模板“chart-2/charts/dashboard/templates/../conf/values1.yaml”

错误调用包括:模板:没有与模板“gotpl”关联的模板“chart-2/charts/dashboard/templates/../../conf/values1.yaml”

Dav*_*aze 6

模板include函数是一个 Helm 扩展,它执行命名模板,就像标准template指令一样,但以字符串形式返回模板的内容。与读取文件无关。

\n

要读回文件,您需要使用顶级.Files对象。特别需要注意的是,它无法读取图表templates目录中的文件;在文件名中添加前缀.Template.BasePath将不起作用,您需要将包含的文件移至其他位置。

\n

假设您conf在主图表目录中创建了一个子目录:

\n
Chart.yaml\nvalues.yaml\nconf/\n  logback.xml\ntemplates/\n  configmap.yaml\n
Run Code Online (Sandbox Code Playgroud)\n

您在此处列出的许多函数 \xe2\x80\x93 .Files.Get、\xe2\x80\x93 都会返回字符串,因此您可以将它们组合在一起。例如,您可以计算 ConfigMap 渲染内容的校验和,如下所示:.Files.Glob.AsConfigtpl

\n
Chart.yaml\nvalues.yaml\nconf/\n  logback.xml\ntemplates/\n  configmap.yaml\n
Run Code Online (Sandbox Code Playgroud)\n

如果您愿意,您也可以在单个非 YAML 文件上执行此操作:.Files.Get返回一个字符串,因此

\n
.Files.Get "conf/logback-spring.xml" | sha256sum\n
Run Code Online (Sandbox Code Playgroud)\n

的根路径.Files.Get是图表的根。您可以检索不在目录中的任何文件templates,但无法访问图表之外的文件。

\n