'storing some application values in kubernetes etcd?

I have application that have some user settings and it runs on kubernetes cluster. I would like the user settings to survive application crash/pod restart.

I was thinking first about having a DB instance for keeping it outside of kubernetes. Then I thought, maybe I could just abuse etcd to store small amount of custom data. Is it a good approach to keep things simple?

Another options I see:

  1. separate db instance outside of kubernetes(overkill)
  2. some json file on PV volume in kubernetes being constantly re-read.
  3. perhaps use hashicorp vault?

What would you use? Its very small amount of data



Solution 1:[1]

you can use Persistent Volume and Persistent Volume claim. pvc or Persistent Volume claim will keep data incase of pod restart or pod crash. this the best way i think to store user data. you can have the suitable storage type and resource size as per your requirement. you can look into official doc. Ref

Solution 2:[2]

If you want to use etcd, a Kubernetes built-in database, it's not really suited for this purpose and shouldn't be used in practice. App shouldn't know about Kubernetes. You need to use DB or PVC to store app related objects in a disk (for example json, yaml or other files).

Solution 3:[3]

You could use etcd, however it's likely overkill for the requirements you outlined above. If you are sure you want to store stateful information in k8s, I'd suggest mounting a persistent volume to your deployment and then using a filestore such as BoltDB (https://github.com/boltdb/bolt) to interface with it.

That being said, I think running a simple SQL database outside of k8s is the simplest overall solution. Anything stateful is never simple with kubernetes and this way you can easily administer the database.

Solution 4:[4]

ConfigMaps are designed to store application config/data persistently and allow you to mount the data into one or more application Pods. There are multiple ways they can be mounted, one common way is via environmental variables. Here is an example from the docs:

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      env:
        # Define the environment variable
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              # The ConfigMap containing the value you want to assign to SPECIAL_LEVEL_KEY
              name: special-config
              # Specify the key associated with the value
              key: special.how
  restartPolicy: Never

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Emon46
Solution 2 laimison
Solution 3 Ben Toogood
Solution 4 Dovid Gefen