在 kubernetes etcd 中存储一些应用程序值?

storing some application values in kubernetes etcd?

我的应用程序有一些用户设置,它在 kubernetes 集群上运行。 我希望用户设置能够在应用程序 crash/pod 重启后继续存在。

我首先考虑的是拥有一个数据库实例以将其保存在 kubernetes 之外。然后我想,也许我可以滥用 etcd 来存储少量自定义数据。 这是保持简单的好方法吗?

我看到的另一个选项:

  1. 在 kubernetes 之外单独的数据库实例(矫枉过正)
  2. kubernetes 中 PV 卷上的某些 json 文件不断被重新读取。
  3. 也许使用 hashicorp 保险库?

你会用什么?数据量很小

您可以使用 Persistent VolumePersistent Volume claimpvcPersistent Volume claim 将保留数据以防 pod 重启或 pod 崩溃。这是我认为存储用户数据的最佳方式。您可以根据需要选择合适的存储类型和资源大小。你可以查看官方文档。 Ref

您可以使用 etcd,但是对于您上面列出的要求来说,它可能有点矫枉过正。如果您确定要在 k8s 中存储有状态信息,我建议将持久卷安装到您的部署中,然后使用诸如 BoltDB (https://github.com/boltdb/bolt) 之类的文件存储与其交互。

话虽如此,我认为 运行 一个简单的 SQL k8s 之外的数据库是最简单的整体解决方案。使用 kubernetes 任何有状态的东西都不是简单的,这样你就可以轻松地管理数据库。

如果你想使用 etcd,一个 Kubernetes 内置数据库,它不太适合这个目的,不应该在实践中使用。 App 不应该知道 Kubernetes。您需要使用 DB 或 PVC 将与应用程序相关的对象存储在磁盘中(例如 json、yaml 或其他文件)。

ConfigMaps 旨在持久存储应用程序 config/data 并允许您将数据装载到一个或多个应用程序 Pods 中。 它们可以通过多种方式安装,一种常见的方式是通过环境变量。 这是文档中的示例:

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