是否有适用于 kubernetes helm 模板的正则表达式函数?

Oli*_*bst 11 kubernetes

我正在尝试实现一个入口 helm 模板,将当前应用程序版本编码到 url 中。这将允许用户通过向他们提供不同版本的应用程序来进行软迁移。

例子:

mydomain.org/1.0/applicationpath
mydomain.org/1.1/applicationpath
mydomain.org/2.0/applicationpath
Run Code Online (Sandbox Code Playgroud)

为了防止在每次更新的入口中手动配置它,我更喜欢使用正则表达式自动确定 major.minor 版本。该应用程序根据 Semver 2.0.0 进行了修订,因此应该使用像 \d+.\d+ 这样的模式。

我试过这样的事情:

apiVersion: extensions/v1beta1
kind: Ingress
spec:
  backend:
    serviceName: {{ .Release.Name }}-my-srv
    servicePort: 80
  rules:
  - host: {{ .Values.app.ingress.host }}
    http:
      paths:
        - path: /{{ .Chart.AppVersion | regex \d+.\d+ }} 
Run Code Online (Sandbox Code Playgroud)

不幸的是,我找不到正则表达式的函数。是否可以选择使用 helm 模板来实现这一点?

phe*_*mer 14

就在这里。然而,不幸的是它没有记录。
Helm 使用sprig库为模板提供附加功能。未记录的是许多已添加到代码中的 sprig 函数(参考问题 #84),正则表达式函数就是其中的一些。你可以在这里找到这些函数:https : //github.com/Masterminds/sprig/blob/master/regex.go

这样你就可以做到 {{ .Chart.AppVersion | regexFind "\d+\.\d+" }}

(请注意,我还在\之前添加了一个以.将其转义.以匹配任何字符,这似乎不是您的意图)

 

不是您的用例,而是可能对使用regex*sprig 中的函数感兴趣的其他人的一项注意事项,不幸的是,sprig 所有者将主题字符串作为所有函数的第二个参数,并且某些函数在之后还有其他参数它(例如regexReplaceAll函数)。之所以会出现这个问题,是因为在管道中使用函数时,管道中前一个元素的结果成为该函数的最后一个参数。所以这不起作用: "foo subject string" | regexReplaceAll "foo" "bar",因为它将被bar视为要操作的字符串,并foo subject string作为替换任何出现的字符串foo(在本例中不会有任何出现)。

  • 以防万一其他人遇到与我相同的问题,我需要转义 `\d` 中的反斜杠才能使其工作,使我的模板片段 `.Capabilities.KubeVersion.Minor | 正则表达式查找 "\\d+"` (3认同)

小智 10

今天不得不处理这个,你会想要这样的东西:

{{ regexFind "\\d+\\.\\d+" .Chart.AppVersion }}

由于 yaml 需要双重转义。

相关文档