使用 Kustomize 将环境变量添加到 Kubernetes StatefulSet

Add environment variable to Kubernetes StatefulSet with Kustomize

我有一个这样的 StatefulSet:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: myns
  name: myapp
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: mycontainer
        image: ...
        ...
        env:
        - name: MY_ENV1
          value: "1"

现在我想通过 Kustomize 添加第二个环境变量,因为它仅在开发环境中使用。我做了这样的事情:

namespace: myns

resources:
...

patches:
- patch: |-
    - op: add
      path: "/spec/template/spec/containers/0/env/-"
      value:
        - name: MY_ENV2
          value: "2"
  target:
    kind: StatefulSet
    namespace: myns
    name: myapp

问题是它不起作用。如果我 运行 kustomize build 我没有看到这个附加变量(我看到其他变体)。

谁能帮我理解如何实现它?

我会考虑在您的 StatefulSet 中使用 envFrom 从 ConfigMap 加载变量,然后您可以使用带有 N 个文字的 configMapGenerator

参见 Configure all key-value pairs in a ConfigMap as container environment variables envFrom 的示例:

Use envFrom to define all of the ConfigMap's data as container environment variables. The key from the ConfigMap becomes the environment variable name in the Pod.

configMapGenerator 是生成这个 ConfigMap 的好方法。它可以通过多种不同的方式完成,但这里有一个 literals 的示例 - 来自同一文档页面,但适用于您的示例:

cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: example-configmap-2
  literals:
  - MY_ENV1=Foo
  - MY_ENV2=Bar
EOF

issue的问题是我忘记在patch的target部分加上version: v1了。然后,您还应该删除值部分中标记名称前面的 -。结果应该是这样的:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: myns
  name: myapp
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: mycontainer
        image: ...
        ...
        env:
        - name: MY_ENV1
          value: "1"

这里是kustomization.yaml文件:

namespace: myns

resources:
...

patches:
- patch: |-
    - op: add
      path: "/spec/template/spec/containers/0/env/-"
      value:
        name: MY_ENV2
        value: "2"
  target:
    kind: StatefulSet
    namespace: myns
    name: myapp

这对我原来的问题很有效。我现在有一个类似的问题,这次我需要替换基础部署中的现有环境变量。