【问题标题】:How to create configMap with .env with Kustomize如何使用 Kustomize 使用 .env 创建 configMap
【发布时间】:2022-01-24 19:00:46
【问题描述】:

我有一个 NextJS 应用程序,它需要安装一个 .env 文件。我通常通过提供 configMap 来做到这一点:

kind: ConfigMap
apiVersion: v1
metadata:
  name: frontend-configmap
  namespace: default
data:
  .env: |-
    NEXT_PUBLIC_API_URL=http://my.domain.com
    API_URL=http://my.domain.com

但是如何使用 Kustomize 做到这一点?

我尝试使用envs,但如何获取其中的值?

configMapGenerator:
  - name: frontend-configmap
    envs:
      - .env

提前谢谢你

【问题讨论】:

    标签: kubernetes environment-variables kustomize


    【解决方案1】:

    您需要先创建.env 文件。理想情况下,即使创建配置映射也应该基于现有文件(以下是 kustomizekubectl --from-file 的示例)。

    那么如何创建一个configmap有两种选择:

    • 创建带有环境变量的.env 文件(这是您的示例配置图)
    • 使用来自.env 文件的环境变量创建一个配置映射(每个变量都是一个单独的键)

    测试结构

    $ tree -a
    .
    ├── .env
    └── kustomization.yaml
    
    
    $ cat .env # same as your test data
    
    NEXT_PUBLIC_API_URL=http://my.domain.com
    API_URL=http://my.domain.com
    

    带有.env 文件的configmap,里面有envvars:

    kustomization.yaml 带有附加选项:

    $ cat kustomization.yaml 
    
    configMapGenerator:
      - name: frontend-configmap
        files: # using files here as we want to create a whole file
          - .env
    generatorOptions:
      disableNameSuffixHash: true # use a static name
    

    disableNameSuffixHash - 禁止将内容哈希后缀附加到生成资源的名称,请参阅generator options

    剩下的就是运行它:

    $ kustomize build .
    
    apiVersion: v1
    data:
      .env: | # you can see it's a file with context within
        NEXT_PUBLIC_API_URL=http://my.domain.com
        API_URL=http://my.domain.com
    kind: ConfigMap
    metadata:
      name: frontend-configmap
    

    使用--from-file选项运行可以达到同样的效果:

    $ kubectl create cm test-configmap --from-file=.env --dry-run=client -o yaml
    
    apiVersion: v1
    data:
      .env: |
        NEXT_PUBLIC_API_URL=http://my.domain.com
        API_URL=http://my.domain.com
    kind: ConfigMap
    metadata:
      creationTimestamp: null
      name: test-configmap
    

    以 envvars 作为键的配置映射:

    $ cat kustomization.yaml 
    
    configMapGenerator:
      - name: frontend-configmap
        envs: # now using envs to create a configmap with envvars as keys inside
          - .env
    generatorOptions:
      disableNameSuffixHash: true # use a static name
    

    运行它以查看输出:

    $ kustomize build .
    
    apiVersion: v1
    data: # you can see there's no file and keys are created directly
      API_URL: http://my.domain.com
      NEXT_PUBLIC_API_URL: http://my.domain.com
    kind: ConfigMap
    metadata:
      name: frontend-configmap
    

    kubectl--from-env-file 选项相同:

    $ kubectl create cm test-configmap --from-env-file=.env --dry-run=client -o yaml
    
    apiVersion: v1
    data:
      API_URL: http://my.domain.com
      NEXT_PUBLIC_API_URL: http://my.domain.com
    kind: ConfigMap
    metadata:
      creationTimestamp: null
      name: test-configmap
    

    更多详情:


    编辑 - 使用现有的 configmap.yaml

    如果configmap 已经存在,那么可以从kustomization.yaml 引用它(正如评论中提到的,kustomize 是一个模板引擎,并且仅在没有任何转换的情况下直接使用它并没有真正使感觉。Here 是您需要使用 kustomize 的示例之一。

    $ tree
    .
    ├── cm.yaml
    └── kustomization.yaml
    

    cm.yaml 与问题中的配置完全相同。

    $ cat kustomization.yaml
     
    resources:
    - cm.yaml
    namePrefix: test- # used namePrefix for demo purpose (you can omit it as well)
    

    构建这个并获得与 .env 相同的 configmap 文件:

    $ kustomize build .
    
    apiVersion: v1
    data:
      .env: |-
        NEXT_PUBLIC_API_URL=http://my.domain.com
        API_URL=http://my.domain.com
    kind: ConfigMap
    metadata:
      name: test-frontend-configmap # name with prefix as it was setup for demo
      namespace: default
    

    【讨论】:

    • 感谢您的详细解答。为了正确理解您:不可能将我的 vars 文件“烘焙”到 kustomization.yml 本身(就像在我的第一个代码 sn-p 中一样?我必须创建一个额外的 @987654355 @ 并在 kustomization.yml 文件中使用它或使用“常规”configMap?
    • @Jan 你可以使用它与常规的configMap 非常相似,但kustomize 是一个模板引擎,这样使用它并没有什么意义 + 在这一点上它会更多IaC 当您拥有包含环境数据的文件(可以是不同的环境)和kustomizations 时使用。我添加了一个带有很好示例或其他选项的链接 - kustomize components
    • @Jan 忘了提 - 我在答案中添加了最后一个块,它涵盖了您的问题,但没有创建 .env 文件,但同样,理想的情况是创建一个文件并分离所有配置,以便您只能编辑一个文件并减少潜在错误的数量等。
    • 你好@Jan。上次更新对整个答案有帮助吗?如果它解决了您的问题,请考虑accepting the answer 和/或如果这对您有用,请点赞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2019-12-26
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多