Kubernetes - 如何使用yaml文件定义ConfigMap?

44

目前,我正在执行以下操作,从 config.json 文件中创建一个配置映射:

```bash kubectl create configmap my-config --from-file=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目录的文件。如果你有图表,为什么不通过helm安装它呢? 另外,你在helm chart中的deployment.yaml应该要正确编写。 - Shudipta Sharma
我能够使用configmap,但我正在寻找一种使用yaml而不是手动使用命令kubectl create configmap创建configmap的方法。 - Chillax
看起来你的configmap文件有helm图表模板。为什么不使用$ helm install命令创建你所需的内容呢?Helm将使用文件config.json的内容替换模板{{ .Files.Get "config.json" | indent 4 }} - Shudipta Sharma
确实,我正在使用helm install。但它没有按预期用config.json文件的内容替换内容,也没有抛出错误。 - Chillax
我认为我有一个解决方案。但首先,你需要展示 $ helm install <chart> --dry-run --debug 的输出结果来确定内容是否正确缩进。 - Shudipta Sharma
显示剩余2条评论
3个回答

65

你的config.json文件应该在mychart/目录下,而不是mychart/templates目录下。

图表模板指南

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安装mychart,加上--dry-run和--debug参数。

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

这对我的一个用例有效。因此,我将其标记为采纳的答案。但是,我希望从values.yaml获取config.json文件中的值。这可能吗? - Chillax
你是否正在尝试从json configmap中获取values.yaml文件中的值? - edbighead
如果是这样,我已经在我的回答中添加了一个例子。 - edbighead
1
@edbighead 生成的 config.json 文件在属性之间缺少分隔符“,”。 - Daniel Lerps
@edbighead,我们可以用嵌套映射替换config.json吗?如果可以,怎么做? - Anubhav Singh

12

这是一个附加到DeploymentConfigMap示例:

ConfigMap:

---
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}}”,那也可以。 - Chillax
你可以像处理路径上的任何其他文件一样使用它。将文件内容粘贴在 config.json: |- 的下方即可。 - Urosh T.
1
我正在寻找一种方法,可以从文件config.json中导入数据,而不必将内容粘贴到yaml文件中。 - Chillax

5

解决方案 01:

  • 将您的config.json文件内容插入到模板中
  • 然后将此模板与config.json一起用于data
  • 接着运行$ 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 }}

这太棒了。唯一真正懂得的人。谢谢你。 - alo42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接