Kubenetes ConfigMap Examples

1. ConfigMap type

  1. property-like key
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  api-url: "https://api.example.com"
  log-level: "debug"
  1. file-like key
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  config.yaml: |
    apiVersion: v1
    data:
      app-name: "MyApp"
      app-version: "1.0"

2. ConfigMap consume type

  1. Args
  • Inside a container command and args

  • samilar with the env var comsuming method

  1. Env var
  • Use it as environment variables for a container

  • normally used property-like key ConfigMap.

  1. Vol Mount
  • Add a file in read-only volume, for the application to read

  • can be used both property-like key and file-like ConfigMap

  1. Write code to run inside the Pod that uses the Kubernetes API to read a ConfigMap (not discuss it here)

3.1 Args

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  my-param: "Hello, Kubernetes!"

---
apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: app-container
    image: busybox
    command: ["/bin/sh"]
    args: ["-c", "sleep 3600", "echo $(MY_PARAM)> log.txt"]
    env: # use it here same as env
    - name: MY_PARAM
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: my-param

2.2 Env var

2.2.1 Use whole data

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  api-url: "https://api.example.com"
  log-level: "debug"

---
apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: app-container
    image: busybox
    command: ["bin/sh", "-c", "sleep 3600"]
    envFrom: # use whole data value
      - configMapRef:
          name: app-config

2.2.2 Use some data

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  api-url: "https://api.example.com"
  log-level: "debug"

---
apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: app-container
    image: busybox
    command: ["bin/sh", "-c", "sleep 3600"]
    env:
    - name: API_URL
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: api-url
    - name: LOG_LEVEL
      valueFrom: # use some data value
        configMapKeyRef:
          name: app-config
          key: log-level

2.3 Vol Mount

2.3.1 use whole file

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  config.yaml: |
    apiVersion: v1
    data:
      app-name: "MyApp"
      app-version: "1.0"

---
apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: app-container
    image: busybox
    command: ["/bin/sh", "-c", "sleep 3600"]
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
      readOnly: true
  volumes:
  - name: config-volume
    configMap:
      name: app-config

2.3.2 Use part data items from file

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  app-name: "MyApp"
  app-version-file: |
    appVersion "1.0"

---
apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: app-container
    image: busybox
    command: ["/bin/sh", "-c", "sleep 3600"]
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
      readOnly: true
  volumes:
  - name: config-volume
    configMap:
      name: app-config
      items:
      - key: app-name
        path: app-name
      - key: app-version-file
        path: app-version-file

we can see the files inside the container:

/ # ls /etc/config/
app-name          app-version-file
/ # cat /etc/config/app-name 
/ # cat /etc/config/app-version-file 
appVersion "1.0"
/ # cat /etc/config/app-name 
MyApp
/ # tree /etc/config/
/etc/config/
├── app-name -> ..data/app-name
└── app-version-file -> ..data/app-version-file

0 directories, 2 files

Above we can see it according to property-like key and file-like create different files.