kubectl apply-ing时替换所有文件中的环境变量

Max*_*Max 3 bash kubernetes kubectl envsubst

假设我们在一个文件夹中有许多 Kubernetes 配置文件kubernetes,我们希望将它们全部应用:

kubectl apply -f kubernetes -n MyNamespace
Run Code Online (Sandbox Code Playgroud)

其中一些文件包含需要首先替换的环境变量(在 Kubernetes 中没有模板)。例如,一些部署 yaml 包含以下内容:

image: myregistry.com/myrepo:$TAG
Run Code Online (Sandbox Code Playgroud)

对于单个 yaml 文件,这可以通过使用 envsubst来完成,例如:

envsubst < deploy.yml | kubectl apply -f -
Run Code Online (Sandbox Code Playgroud)

对所有 yaml 文件进行这些替换的最佳方法是什么?

(循环文件夹中的文件并按envsubst上述方式调用是一种选择,但我怀疑最好将整个文件夹传递给kubectl而不是单个文件)

Max*_*Max 9

这有效:

for f in *.yaml; do envsubst < $f | kubectl apply -f -; done
Run Code Online (Sandbox Code Playgroud)


Ini*_*ian 5

您可以让envsubst从标准输入读取多个文件的内容,就像< deploy.yaml使用进程替换<(..)功能bash或使用普通 ol'读取一个文件一样cat

envsubst < <(cat *.yaml) | kubectl apply -f -
Run Code Online (Sandbox Code Playgroud)

或者

cat *.yaml | envsubst - | kubectl apply -f -
Run Code Online (Sandbox Code Playgroud)

  • 我说得太早了——这实际上不太管用。由于 kubectl 将输入视为具有多个资源的单个文件,因此它们之间必须有一个“---”分隔符。请参阅 /sf/answers/3657919121/。 (5认同)
  • 真正发生的是,当“kubectl”看到输入时,它甚至不知道它来自哪个文件,除了它的标准输入上的内容,即“-”l,它并不真正关心 (2认同)
  • 感谢这个帖子,我找到了一种使用 envsubst 将系统环境传递给 Kustomize 的方法:只需运行 `envsubst &lt; &lt;(kubectl kustomize Overlays/staging) | kubectl 应用-f-` (2认同)