【问题标题】:Kubernetes - How to define ConfigMap built using a file in a yaml?Kubernetes - 如何定义使用 yaml 中的文件构建的 ConfigMap?
【发布时间】:2019-04-25 01:13:06
【问题描述】:

目前我正在通过执行从文件 config.json 创建一个配置映射:

kubectl create configmap jksconfig --from-file=config.json

我希望将 ConfigMap创建作为部署的一部分并尝试这样做:

apiVersion: v1
kind: ConfigMap
metadata:
  name: jksconfig
data:
  config.json: |-
    {{ .Files.Get "config.json" | indent 4 }}

但似乎不起作用。什么应该进入 configmap.yaml 以便创建相同的 configmap?

---更新---

当我进行 helm install 试运行时:

# Source: mychartv2/templates/jks-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: jksconfig
data:
  config.json: |

注意:我使用 minikube 作为我的 kubernetes 集群

【问题讨论】:

  • 您显示了来自 chart/templates 目录的文件。如果您有图表,那么为什么不通过 h​​elm 安装图表?而且你的 helm chart 中的 deployment.yaml 应该已经正确编写了。
  • 我可以使用 configmap ,我正在寻找一种使用 yaml 而不是手动使用命令 kubectl create configmap 创建 configmap 的方法
  • 您的 configmap 文件似乎有 helm 图表模板。为什么你不使用$ helm install 命令来创建你的需求。 Helm 会将模板 {{ .Files.Get "config.json" | indent 4 }} 替换为文件 config.json 的内容。
  • 确实,我正在使用 helm install。但它没有用文件 config.json 的内容替换预期的内容,也没有抛出错误
  • 我想我得到了一个解决方案。但首先你需要显示$ helm install <chart> --dry-run --debug的输出,看看内容是否正确缩进

标签: kubernetes minikube kubernetes-helm configmap


【解决方案1】:

您的 config.json 文件应该在您的 mychart/ 目录中,而不是在 mychart/templates

Chart Template Guide

configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  config.json: |-
{{ .Files.Get "config.json" | indent 4}}

config.json

{
    "val": "key"
}

helm install --dry-run --debug mychart

[debug] Created tunnel using local port: '52091'     
                                                     
[debug] SERVER: "127.0.0.1:52091"                    
                                                     
...           
                                                     
NAME:   dining-saola                                 
REVISION: 1                                          
RELEASED: Fri Nov 23 15:06:17 2018                   
CHART: mychart-0.1.0                                 
USER-SUPPLIED VALUES:                                
{}                                                   
                                                     
...
                                                     
---                                                  
# Source: mychart/templates/configmap.yaml           
apiVersion: v1                                       
kind: ConfigMap                                      
metadata:                                            
  name: dining-saola-configmap                       
data:                                                
  config.json: |-                                    
    {                                                
        "val": "key"                                 
    }     

编辑:

但我希望 config.json 文件中的值取自 values.yaml。这可能吗?

configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  config.json: |-
    {
{{- range $key, $val := .Values.json }}
{{ $key | quote | indent 6}}: {{ $val | quote }}
{{- end}}
    }

values.yaml

json:
  key1: val1
  key2: val2
  key3: val3

helm install --dry-run --debug mychart

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mangy-hare-configmap
data:
  config.json: |-
    {
      "key1": "val1"
      "key2": "val2"
      "key3": "val3"
    }

【讨论】:

  • 这确实适用于我的一个用例。所以标记为接受的答案。但我希望 config.json 文件中的值取自 values.yaml。这可能吗?
  • 您是否尝试从您的 json configmap 中的 values.yaml 文件中获取值?
  • 如果是这样,我已经在我的答案中添加了一个示例。
  • @edbighead 生成的 config.json 缺少属性之间的分隔 ,...
  • @edbighead 我们可以用嵌套映射的 config.yaml 替换 config.json 吗?如果是怎么办?
【解决方案2】:

以下是附加到DeploymentConfigMap 示例:

配置映射:

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: jksconfig
data:
  config.json: |-
{{ .Files.Get "config.json" | indent 4 }}

部署:

---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: jksapp
  labels:
    app: jksapp
spec:
  selector:
    matchLabels:
      app: jksapp
  template:
    metadata:
      labels:
        app: jksapp
      containers:
        - name: jksapp
          image: jksapp:1.0.0
          ports:
            - containerPort: 8080
          volumeMounts:
            - name: config #The name(key) value must match pod volumes name(key) value 
              mountPath: /path/to/config.json
      volumes:
        - name: config
          configMap:
            name: jksconfig

【讨论】:

  • 我能够在我的部署中使用 ConfigMap。我只想知道如何从 config.json 文件中获取值(我现在手动创建它)另外,如果我粘贴文件内容而不是 {{ .Files.Get "config.json" | indent 4 }} - 那也可以
  • 您可以像使用路径上的任何文件一样使用它。您将文件内容粘贴到config.json: |- 行下方。
  • 我正在寻找一种从 config.json 文件中导入数据的方法,而不必将内容粘贴到 yaml 文件中
【解决方案3】:

解决方案 01:

  • 将您的config.json 文件内容插入到模板中
  • 然后将此模板用于您的data 对抗config.json
  • 然后运行$ helm install 命令

终于,

{{define "config"}}
{
    "a": "A",
    "b": {
        "b1": 1
    }
}
{{end}}

apiVersion: v1
kind: ConfigMap
metadata:
  name: jksconfig
  labels:
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    app: "my-app"
    heritage: "{{ .Release.Service }}"
    release: "{{ .Release.Name }}"
data:
  config.json: {{ (include "config" .) | trim | quote }}

【讨论】:

  • 这很棒。只有真正懂的人。谢谢。
猜你喜欢
  • 2021-09-12
  • 1970-01-01
  • 2020-12-10
  • 2019-11-26
  • 2020-07-23
  • 2018-12-18
  • 1970-01-01
  • 2020-02-06
  • 2016-09-03
相关资源
最近更新 更多