使用 Helm Chart 将 CouchDB 部署到 K8S 时如何定义持久卷?

How do I define persistent volumes when deploying CouchDB to K8S using its helm chart?

我正在努力思考将 [CouchDB](https://couchdb.apache.org] 部署到 Kubernetes 集群的正确步骤。

我做的是:

kubectl create secret --namespace mynamespace generic couch-test-couchdb \
  --from-literal=adminUsername=admin
  --from-literal=adminPassword=password
  --from-literal=cookieAuthSecret=supersecret

helm install --namespace mynamespace couch-test \
   --set couchdbConfig.couchdb.uuid=$(uuid | tr -d -) \
   -f couch-test.yml \
   couchdb/couchdb

couch-test.yml:

createAdminSecret : false
persistentVolume.enabled : true
persistentVolume.size: 10Gi

该命令运行时没有错误消息,但是没有发生持久存储分配。当我键入 kubectl describe pod couch-test-couchdb-0 时,我进入配置存储卷、数据库存储卷 EmptyDir

我错过了什么?

我怀疑我需要先创建一个 PV,但不清楚如何 link 安装它。是存储类还是名称还是其他?

** 更新 **

我重新开始,删除设置并使用 k apply --namespace mynamespace -f couch-storage.yml

添加存储 class 定义
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: couch-storage
provisioner: kubernetes.io/no-provisioner
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer

所以 couch-farm.yml 现在看起来像这样:

createAdminSecret : false
persistentVolume.enabled : true
persistentVolume.size: 10Gi
persistentVolume.storageClass : couch-storage

没有区别,k describe pod... 中的存储仍然指向 EmptyDir

存储 classes 是 environment/infrastructure 特定的,这就是为什么 CouchDB Helm chart 没有创建任何存储。

图表应使用图表值文件中指定的存储 class 为每个 pod 创建一个 PersistantVolumeClaim。大多数生产 Kubernetes 环境将有一个支持动态配置的预配置 StorageClass 资源列表(或您可以在自己的 StorageClass 资源中引用的供应器),即在声明中指定存储 class 足以满足后端需求开始并分配适当的存储并使其可供 Kubernetes 使用。

在您的情况下,您似乎正在定义一个 Local Persistant Volume for storage, which is perfectly fine but will be more complicated than using a dynamic provisioner - you'll need to go through the steps in the documentation 来配置它并生成持久卷。

如果您的环境支持,使用 here 中列出的动态供应器可能会更容易上手。

扩展 Will 的解决方案和我的边缘案例:

storageClass 无法进行动态配置时,helm chart 似乎不会创建 PersistentVolumeClaim

在我的例子中,我仅使用 Microk8s 配置具有本地存储的边缘设备。幸运的是,Microk8s 附带了一个 storageClass,它完全满足我的需要:动态配置本地存储。所以这里缺少的部分是条目

createAdminSecret: false
allowAdminParty: false
persistentVolume:
  enabled : true
  size: 10Gi
  storageClass : microk8s-hostpath

(点符号 persistentVolume.storageClass 在这里不起作用)

提醒一句:不要依赖这样的配置进行重负载生产。在我的例子中,边缘设备会立即复制云数据库并使用 RAID5 驱动器,因此数据丢失的风险是可控的