'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:
- separate db instance outside of kubernetes(overkill)
- some json file on PV volume in kubernetes being constantly re-read.
- 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 |
