Home > OS >  How to create a Kubernetes configMap from part of a yaml file?
How to create a Kubernetes configMap from part of a yaml file?

Time:03-16

As I know the way to create a configMap in Kubernetes from a file is to use:
"--from-file" option for kubectl

What I am looking for is a way to only load part of the yaml file into the configMap.
Example: Let's say I have this yml file:

family:
  Boys:
    - name: Joe
    - name: Bob
    - name: dan
  Girls:
    - name: Alice
    - name: Jane  

Now I want to create a configMap called 'boys' which will include only the 'Boys' section.
Possible ?

Another thing that could help if the above is not possible is when I am exporting the configMap as environment variables to a pod (using 'envFrom') to be able to only export part of the configMap.
Both options will work for me.

Any idea ?

CodePudding user response:

The ConfigMap uses a key and value for its configuration. Based on your example, you get multiple arrays of data where there are multiple values with their own keys. But you can create multiple ConfigMap from different file for these issues.

  1. First you need to create .yaml files to create a ConfigMap guided by the documentation. First file call Boys.yaml
# Env-files contain a list of environment variables.
# These syntax rules apply:
# Each line in an env file has to be in VAR=VAL format.
# Lines beginning with # (i.e. comments) are ignored.
# Blank lines are ignored.
# There is no special handling of quotation marks (i.e. they will be part of the ConfigMap value)).

name=Joe
name=Bob
name=Dan

Second file call Girls.yaml

name=Alice
name=Jane
  1. Create your ConfigMap
kubectl create configmap NmaeOfYourConfigmap --from-env-file=PathToYourFile/Boys.yaml
  1. where the output is similar to this:
apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: 
  name: NmaeOfYourConfigmap
  namespace: default
  resourceVersion: 
  uid:
data:
  name: Joe
  name: Bob
  name: Dan
  1. Finally, you can pass these ConfigMap to pod or deployment using configMapRef entries:
        envFrom:
          - configMapRef:
              name: NmaeOfYourConfigmap-Boys
          - configMapRef:
              name: NmaeOfYourConfigmap-Girls

CodePudding user response:

Configmaps cannot contain rich yaml data. Only key value pairs. So if you want to have a list of things, you need to express this as a multiline string.

With that in mind you could use certain tools, such a yq to query your input file and select the part you want.

For example:

podman run -rm --interactive bluebrown/tpl '{{ .family.Boys | toYaml }}' < fam.yaml \
  | kubectl create configmap boys --from-file=Boys=/dev/stdin

The result looks like this

apiVersion: v1
kind: ConfigMap
metadata:
  name: boys
  namespace: sandbox
data:
  Boys: | 
    - name: Joe
    - name: Bob
    - name: dan

You could also encode the file or part of the file with base64 and use that as an environment variable, since you get a single string, which is easily processable, out of it. For example:

$ podman run --rm --interactive bluebrown/tpl \
  '{{ printf "Boys:\n%s" (toYaml .family.Boys) | b64enc }}' < fam.yaml

# use this string as env variable and decode it in your app
Qm95czoKLSBuYW1lOiBKb2UKLSBuYW1lOiBCb2IKLSBuYW1lOiBkYW4K

Or with set env which you could further combine with dry run if required.

podman run --rm --interactive bluebrown/tpl \
 'YAML_BOYS={{ printf "Boys:\n%s" (toYaml .family.Boys) | b64enc }}' < fam.yaml \
  | kubectl set env -e - deploy/myapp

Disclaimer, I created the above used tool tpl. As mentioned, you might as well use alternative tools such as yq.

  • Related